Enviar pesquisa
Carregar
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
•
5 gostaram
•
7,601 visualizações
Ryuji Yamashita
Seguir
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 96
Baixar agora
Baixar para ler offline
Recomendados
20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL
Ryusuke Kajiyama
Hello Java
Hello Java
Chihiro Ito
Java SE 再入門
Java SE 再入門
minazou67
2015/11/15 Javaでwebアプリケーション入門
2015/11/15 Javaでwebアプリケーション入門
Asami Abe
Java Flight Recorderの紹介 at Java Day Tokyo 2015
Java Flight Recorderの紹介 at Java Day Tokyo 2015
Chihiro Ito
Java EE パフォーマンスTips #glassfish_jp
Java EE パフォーマンスTips #glassfish_jp
Norito Agetsuma
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」
Hiroaki NAKADA
Java EE 再入門
Java EE 再入門
minazou67
Recomendados
20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL
Ryusuke Kajiyama
Hello Java
Hello Java
Chihiro Ito
Java SE 再入門
Java SE 再入門
minazou67
2015/11/15 Javaでwebアプリケーション入門
2015/11/15 Javaでwebアプリケーション入門
Asami Abe
Java Flight Recorderの紹介 at Java Day Tokyo 2015
Java Flight Recorderの紹介 at Java Day Tokyo 2015
Chihiro Ito
Java EE パフォーマンスTips #glassfish_jp
Java EE パフォーマンスTips #glassfish_jp
Norito Agetsuma
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」
Hiroaki NAKADA
Java EE 再入門
Java EE 再入門
minazou67
Java EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 Fall
Masatoshi Tada
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE Apps
Yoshimasa Tanabe
Java仮想マシンの実装技術
Java仮想マシンの実装技術
Kiyokuni Kawachiya
Java EEの話(仮)
Java EEの話(仮)
Satoshi Kubo
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
SEGADevTech
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
賢 秋穂
Laravel5を使って開発してみた
Laravel5を使って開発してみた
Takeo Noda
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話す
Takaya Saeki
Open Liberty / WebSphere Liberty
Open Liberty / WebSphere Liberty
Takakiyo Tanaka
Spring3.1概要x di
Spring3.1概要x di
Yuichi Hasegawa
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
めんどくさくない Scala #kwkni_scala
めんどくさくない Scala #kwkni_scala
Kazuhiro Sera
JavaScript.Next
JavaScript.Next
dynamis
.NET Compiler Platform
.NET Compiler Platform
信之 岩永
Jsug 20160422 slides
Jsug 20160422 slides
Yuichi Hasegawa
sbt, past and future / sbt, 傾向と対策
sbt, past and future / sbt, 傾向と対策
scalaconfjp
Spring frameworkが大好きなおはなし
Spring frameworkが大好きなおはなし
Satoshi Kisanuki
WildFly Swarm In Progress
WildFly Swarm In Progress
Yoshimasa Tanabe
jjugccc2018 app review postmortem
jjugccc2018 app review postmortem
tamtam180
PlaySQLAlchemyORM2017.key
PlaySQLAlchemyORM2017.key
泰 増田
HTML5で作るiPhoneアプリケーション
HTML5で作るiPhoneアプリケーション
だいすけ ふるかわ
Html5で作るiPhoneアプリケーション2010
Html5で作るiPhoneアプリケーション2010
だいすけ ふるかわ
Mais conteúdo relacionado
Mais procurados
Java EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 Fall
Masatoshi Tada
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE Apps
Yoshimasa Tanabe
Java仮想マシンの実装技術
Java仮想マシンの実装技術
Kiyokuni Kawachiya
Java EEの話(仮)
Java EEの話(仮)
Satoshi Kubo
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
SEGADevTech
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
賢 秋穂
Laravel5を使って開発してみた
Laravel5を使って開発してみた
Takeo Noda
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話す
Takaya Saeki
Open Liberty / WebSphere Liberty
Open Liberty / WebSphere Liberty
Takakiyo Tanaka
Spring3.1概要x di
Spring3.1概要x di
Yuichi Hasegawa
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
めんどくさくない Scala #kwkni_scala
めんどくさくない Scala #kwkni_scala
Kazuhiro Sera
JavaScript.Next
JavaScript.Next
dynamis
.NET Compiler Platform
.NET Compiler Platform
信之 岩永
Jsug 20160422 slides
Jsug 20160422 slides
Yuichi Hasegawa
sbt, past and future / sbt, 傾向と対策
sbt, past and future / sbt, 傾向と対策
scalaconfjp
Spring frameworkが大好きなおはなし
Spring frameworkが大好きなおはなし
Satoshi Kisanuki
WildFly Swarm In Progress
WildFly Swarm In Progress
Yoshimasa Tanabe
jjugccc2018 app review postmortem
jjugccc2018 app review postmortem
tamtam180
PlaySQLAlchemyORM2017.key
PlaySQLAlchemyORM2017.key
泰 増田
Mais procurados
(20)
Java EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 Fall
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE Apps
Java仮想マシンの実装技術
Java仮想マシンの実装技術
Java EEの話(仮)
Java EEの話(仮)
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
Laravel5を使って開発してみた
Laravel5を使って開発してみた
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話す
Open Liberty / WebSphere Liberty
Open Liberty / WebSphere Liberty
Spring3.1概要x di
Spring3.1概要x di
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
めんどくさくない Scala #kwkni_scala
めんどくさくない Scala #kwkni_scala
JavaScript.Next
JavaScript.Next
.NET Compiler Platform
.NET Compiler Platform
Jsug 20160422 slides
Jsug 20160422 slides
sbt, past and future / sbt, 傾向と対策
sbt, past and future / sbt, 傾向と対策
Spring frameworkが大好きなおはなし
Spring frameworkが大好きなおはなし
WildFly Swarm In Progress
WildFly Swarm In Progress
jjugccc2018 app review postmortem
jjugccc2018 app review postmortem
PlaySQLAlchemyORM2017.key
PlaySQLAlchemyORM2017.key
Destaque
HTML5で作るiPhoneアプリケーション
HTML5で作るiPhoneアプリケーション
だいすけ ふるかわ
Html5で作るiPhoneアプリケーション2010
Html5で作るiPhoneアプリケーション2010
だいすけ ふるかわ
第1回 始めてみよう Web 動画 〜 基礎編 まずは iPhone から
第1回 始めてみよう Web 動画 〜 基礎編 まずは iPhone から
Katz Ueno
(エンジニアから見た) 最近のスマートウォッチ事情
(エンジニアから見た) 最近のスマートウォッチ事情
Tomoya Yamamoto
<Yahoo!プロモーション広告>「iPhone 6」発売後はどうなる? 関連キーワード検索傾向
<Yahoo!プロモーション広告>「iPhone 6」発売後はどうなる? 関連キーワード検索傾向
Yahoo! JAPAN Marketing Solution
デブサミ2009: iPhone開発者座談会
デブサミ2009: iPhone開発者座談会
masayoshi takahashi
「iPhone 6s/6s Plus」発売前後の検索実績からみる、インターネットユーザー動向
「iPhone 6s/6s Plus」発売前後の検索実績からみる、インターネットユーザー動向
Yahoo! JAPAN Marketing Solution
Java ScriptでつくるはじめてのiPhoneAndroidゲーム開発体験ハンズオン
Java ScriptでつくるはじめてのiPhoneAndroidゲーム開発体験ハンズオン
健一 茂木
C#でiPhoneアプリ開発 with MonoTouch
C#でiPhoneアプリ開発 with MonoTouch
Shin Ise
iPhoneアプリ開発を楽に楽しくするサイトまとめ
iPhoneアプリ開発を楽に楽しくするサイトまとめ
Hiramatsu Ryosuke
HTML5@iPhoneゲーム開発
HTML5@iPhoneゲーム開発
h_kishi
Phone Appli「PA Sync」 説明資料
Phone Appli「PA Sync」 説明資料
PA_Hitomi
Office for iPad Office for iPhone 企業利用における問題点のまとめ
Office for iPad Office for iPhone 企業利用における問題点のまとめ
adachiyosuke
コンピューター支援言語学習
コンピューター支援言語学習
Parisa Mehran
iPhone 5 の Wi-Fi ちゃんと動いてましたか? #yidev
iPhone 5 の Wi-Fi ちゃんと動いてましたか? #yidev
Tomohiro Kumagai
非It系総務の社内kintone促進 kintone Café japan
非It系総務の社内kintone促進 kintone Café japan
naoya takata
女性はグリー、男性はモバゲーのアプリデザインを支持!! -iphoneアプリデザイン調査-
女性はグリー、男性はモバゲーのアプリデザインを支持!! -iphoneアプリデザイン調査-
CREATIVE SURVEY
ニコニコ動画iPhoneアプリの作り方@スマートフォン2011講演資料
ニコニコ動画iPhoneアプリの作り方@スマートフォン2011講演資料
Kentaro Matsumae
Rubyを楽しくする第一歩!ブロックを理解する!
Rubyを楽しくする第一歩!ブロックを理解する!
Kanako Kobayashi
iPhoneアプリ無料でできるプロモーション15の活動
iPhoneアプリ無料でできるプロモーション15の活動
Hiromitsu Ishimori
Destaque
(20)
HTML5で作るiPhoneアプリケーション
HTML5で作るiPhoneアプリケーション
Html5で作るiPhoneアプリケーション2010
Html5で作るiPhoneアプリケーション2010
第1回 始めてみよう Web 動画 〜 基礎編 まずは iPhone から
第1回 始めてみよう Web 動画 〜 基礎編 まずは iPhone から
(エンジニアから見た) 最近のスマートウォッチ事情
(エンジニアから見た) 最近のスマートウォッチ事情
<Yahoo!プロモーション広告>「iPhone 6」発売後はどうなる? 関連キーワード検索傾向
<Yahoo!プロモーション広告>「iPhone 6」発売後はどうなる? 関連キーワード検索傾向
デブサミ2009: iPhone開発者座談会
デブサミ2009: iPhone開発者座談会
「iPhone 6s/6s Plus」発売前後の検索実績からみる、インターネットユーザー動向
「iPhone 6s/6s Plus」発売前後の検索実績からみる、インターネットユーザー動向
Java ScriptでつくるはじめてのiPhoneAndroidゲーム開発体験ハンズオン
Java ScriptでつくるはじめてのiPhoneAndroidゲーム開発体験ハンズオン
C#でiPhoneアプリ開発 with MonoTouch
C#でiPhoneアプリ開発 with MonoTouch
iPhoneアプリ開発を楽に楽しくするサイトまとめ
iPhoneアプリ開発を楽に楽しくするサイトまとめ
HTML5@iPhoneゲーム開発
HTML5@iPhoneゲーム開発
Phone Appli「PA Sync」 説明資料
Phone Appli「PA Sync」 説明資料
Office for iPad Office for iPhone 企業利用における問題点のまとめ
Office for iPad Office for iPhone 企業利用における問題点のまとめ
コンピューター支援言語学習
コンピューター支援言語学習
iPhone 5 の Wi-Fi ちゃんと動いてましたか? #yidev
iPhone 5 の Wi-Fi ちゃんと動いてましたか? #yidev
非It系総務の社内kintone促進 kintone Café japan
非It系総務の社内kintone促進 kintone Café japan
女性はグリー、男性はモバゲーのアプリデザインを支持!! -iphoneアプリデザイン調査-
女性はグリー、男性はモバゲーのアプリデザインを支持!! -iphoneアプリデザイン調査-
ニコニコ動画iPhoneアプリの作り方@スマートフォン2011講演資料
ニコニコ動画iPhoneアプリの作り方@スマートフォン2011講演資料
Rubyを楽しくする第一歩!ブロックを理解する!
Rubyを楽しくする第一歩!ブロックを理解する!
iPhoneアプリ無料でできるプロモーション15の活動
iPhoneアプリ無料でできるプロモーション15の活動
Semelhante a PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
【PHPカンファレンス福岡】PHP 5.3 + CakePHP 1.3 → PHP 7 + CakePHP 3 移行を決めた話
【PHPカンファレンス福岡】PHP 5.3 + CakePHP 1.3 → PHP 7 + CakePHP 3 移行を決めた話
Yuki Kanazawa
Weeklycms20120218
Weeklycms20120218
Yoshi Sakai
もう XAMPP / MAMP はいらない! Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない! Vagrant で作る PHP 開発環境
Masashi Shinbara
behatエクステンションの作り方
behatエクステンションの作り方
Ryo Tomidokoro
ChefユーザのためのAnsible入門
ChefユーザのためのAnsible入門
Mahito Ogura
PHPカンファレンス2014の懇親会飛び込みLT資料
PHPカンファレンス2014の懇親会飛び込みLT資料
Junichi Ishida
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
Rui Hirokawa
ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chef
npsg
PHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作った
Hironobu Saitoh
FukuokaPHP 3
FukuokaPHP 3
ichikaway
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki
Niigata.pm #1
Niigata.pm #1
hayajo Imai
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
Kentaro Ohkouchi
Haikara
Haikara
jewel12
今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4
アシアル株式会社
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )
hiro345
Hive undocumented feature
Hive undocumented feature
tamtam180
スクリプト言語PHP攻略法
スクリプト言語PHP攻略法
Rui Hirokawa
PHPCON_TOKYO_2022_Bigginer.pptx
PHPCON_TOKYO_2022_Bigginer.pptx
Hideo Kashioka
Backlogでの Perlのつかいかた
Backlogでの Perlのつかいかた
Ryuzo Yamamoto
Semelhante a PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
(20)
【PHPカンファレンス福岡】PHP 5.3 + CakePHP 1.3 → PHP 7 + CakePHP 3 移行を決めた話
【PHPカンファレンス福岡】PHP 5.3 + CakePHP 1.3 → PHP 7 + CakePHP 3 移行を決めた話
Weeklycms20120218
Weeklycms20120218
もう XAMPP / MAMP はいらない! Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない! Vagrant で作る PHP 開発環境
behatエクステンションの作り方
behatエクステンションの作り方
ChefユーザのためのAnsible入門
ChefユーザのためのAnsible入門
PHPカンファレンス2014の懇親会飛び込みLT資料
PHPカンファレンス2014の懇親会飛び込みLT資料
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chef
PHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作った
FukuokaPHP 3
FukuokaPHP 3
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
Niigata.pm #1
Niigata.pm #1
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
Haikara
Haikara
今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )
Hive undocumented feature
Hive undocumented feature
スクリプト言語PHP攻略法
スクリプト言語PHP攻略法
PHPCON_TOKYO_2022_Bigginer.pptx
PHPCON_TOKYO_2022_Bigginer.pptx
Backlogでの Perlのつかいかた
Backlogでの Perlのつかいかた
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
1.
PHP in Java
-Quercus- による レガシーマイグレーション 山下 竜司 株式会社アットウェア/Facebook4J #jjug_ccc #ccc_r12
2.
自己紹介 •山下 竜司 •株式会社アットウェア •@roundrop •Facebook4J -
http://facebook4j.org
3.
4.
5.
6.
PHP: Hypertext Preprocessor
7.
http://venturebeat.com/2013/05/17/google-app-engine-finally-supports-php-the-language-that-runs-75-of-the-web/ 世界一 広まっている言語
8.
世界一 dis られている言語
9.
Quercus https://www.flickr.com/photos/justinwkern/6140775849/
10.
Quercus •けっこう昔からあった > svn log
svn://svn.caucho.com/home/svn/svnroot/resin/trunk/modules/quercus
11.
Quercus •PHP (PHP5 相当)
を Java 上で動かすことを 可能にする Java で実装されたエンジン
12.
Quercus •PHP (PHP5 相当)
を Java 上で動かすことを 可能にする Java で実装されたエンジン •オープンソース (ライセンスは GPL)
13.
Quercus •PHP (PHP5 相当)
を Java 上で動かすことを 可能にする Java で実装されたエンジン •オープンソース (ライセンスは GPL) •Caucho Technology 社の商用アプリケーショ ンサーバー Resin の一部
14.
PHP アプリといえば WordPress
15.
WordPress on Quercus デモ
16.
WordPress on Quercus デモ ! https://gist.github.com/roundrop/4977262
17.
Links •Home ‣http://quercus.caucho.com/ •Change Log ‣http://caucho.com/resin-4.0/changes/changes.xtp •ソースコード ‣ svn://svn.caucho.com/home/svn/svnroot/resin/trunk/modules/quercus •バグトラッカー ‣
http://bugs.caucho.com/view_all_bug_page.php 見た目に反して 開発はわりとアクティブ
18.
Quercus の構造 •実体は Servlet
※Servlet 以外の起動方法もあるが割愛 [web.xml] <servlet> <servlet-name>Quercus Servlet</servlet-name> <servlet-class> com.caucho.quercus.servlet.QuercusServlet </servlet-class> <init-param> : </servlet> <servlet-mapping> <servlet-name>Quercus Servlet</servlet-name> <url-pattern>*.php</url-pattern> </servlet-mapping>
19.
Quercus の構造 QuercusServlet Tomcat など xxxx.php 1.
phpファイル読込 2. 解析 3. 実行
20.
PHP コードの再現力 •Quercus の
PHP 再現力はかなりのもの •(モノによるが) だいたい 90% 以上のコード は動く •逆に言うとある程度は改修・実装が必要 ‣Quercus で未実装の PHP 関数の自前実装 ‣対応していないシンタックスを調整 など
21.
PHP コードの実行速度 •速い •素の PHP
より速くなる事例もある •キャッシュ、コネクションプールなど Java 資産が使える •プロダクションに投入できるレベル
22.
PHP から Java
のコードを呼び出せる •Java 上での PHP コードの実行だけでなく、 PHP コードから Java のコードを呼び出せる
23.
PHP から Java
のコードを呼び出せる •Java 上での PHP コードの実行だけでなく、 PHP コードから Java のコードを呼び出せる <?php import java.lang.System; import java.util.Date; $date = new Date(); System::out->println($date);
24.
PHP から Java
のコードを呼び出せる QuercusServlet Tomcat など xxxx.php Java コード 呼び出し Java Class
25.
つまり、 •PHP アプリを Tomcat
等の上で動かしつつ
26.
つまり、 •PHP アプリを Tomcat
等の上で動かしつつ •これからつくる新機能は Java で開発したり
27.
つまり、 •PHP アプリを Tomcat
等の上で動かしつつ •これからつくる新機能は Java で開発したり •PHP の処理の一部だけ Java に置き換えたり
28.
つまり、 •PHP アプリを Tomcat
等の上で動かしつつ •これからつくる新機能は Java で開発したり •PHP の処理の一部だけ Java に置き換えたり レガシーマイグレーションに使える
29.
Java Application Server (Tomcat
など) PHP
30.
Java Application Server (Tomcat
など) PHP Java (Spring等) 既存機能はPHPのまま 新機能はJava
31.
Java Application Server (Tomcat
など) PHP Java (Spring等) 既存機能はPHPのまま 新機能はJava 性能上のボトルネックだけ Java 化
32.
Java Application Server (Tomcat
など) PHP Java (Spring等) 既存機能はPHPのまま 新機能はJava あまりにひどい部分だけ Java 化 性能上のボトルネックだけ Java 化
33.
Java Application Server (Tomcat
など) PHP Java (Spring等) 既存機能はPHPのまま 新機能はJava あまりにひどい部分だけ Java 化 性能上のボトルネックだけ Java 化 スモールスタートしてから徐々に Java の範囲を 広げていき、最終的には PHP をなくす
34.
実践 https://www.flickr.com/photos/pshab/1366448271/
35.
まずは PHP をまともに動かす
36.
PHP をまともに動かすまでの障壁 •文字化け •Quercus が解釈できないシンタックス •Quercus
で未対応な PHP 関数
37.
PHP をまともに動かすまでの障壁 •文字化け •Quercus が解釈できないシンタックス •Quercus
で未対応な PHP 関数
38.
文字化け対策 •既存 PHP アプリを
Quercus 上で動かしてみ たところ絶望的に文字化け
39.
文字化け対策 •既存 PHP アプリを
Quercus 上で動かしてみ たところ絶望的に文字化け •Java でつくる部分は UTF-8 にしたいので、 全体的に UTF-8 で統一したい
40.
文字化け対策 •文字コードを UTF-8 に
える ‣ソースコード ‣画面の charset ‣データベース ‣リソースファイル ‣:
41.
文字化け対策 •Quercus は ISO-8859-1
前提で動作する •unicode.semantics=on ‣on にすることで UTF-8 前提で動作するよ うになる ‣php.ini に書いて Quercus に読み込ませる
42.
文字化け対策 •QuercusServlet に ini-file
パラメータを指定 [WEB-INF/php.ini] unicode.semantics=on ! [web.xml] <servlet> <servlet-name>Quercus Servlet</servlet-name> <servlet-class> com.caucho.quercus.servlet.QuercusServlet </servlet-class> <init-param> <param-name>ini-file</param-name> <param-value>WEB-INF/php.ini</param-value> </init-param> :
43.
文字化け対策 QuercusServlet Tomcat など xxxx.php php.ini unicode.semantics=on で動作モードを ISO-8859-1 →
UTF-8 に変更
44.
文字化け対策 •文字化けの発生する可能性のある箇所 ‣画面に記述した日本語の表示 ‣GET/POST した日本語パラメータの表示 ‣DB に入っている日本語の表示・登録 ‣セッションに入れた日本語の表示 ‣ファイル入力・出力 ‣ログ などなど
45.
文字化け対策 •アップロードファイル名 ‣最新版でも文字化け ‣ファイル名が重要な場合は commons- fileupload の実装に差し替えるなどの対応 が必要 ‣com.caucho.quercus.env.Post#fillPost()
46.
文字化け対策 •UTF-8 以外でのレスポンス出力 ‣Excel 前提だから
CSV ファイルのダウン ロードは SJIS で、といった要件のとき ‣“SJIS-win” → “Windows-31J” ‣print じゃなくて echo を使う printf("%srn", mb_convert_encoding($data, "SJIS-win", "UTF-8")); ↓ echo mb_convert_encoding($data, "Windows-31J", "UTF-8")."rn";
47.
PHP をまともに動かすまでの障壁 •文字化け •Quercus が解釈できないシンタックス •Quercus
で未対応な PHP 関数
48.
解釈できないシンタックス •動的に変数名やクラス名を決定するシンタック スは Quercus が解釈できない ! ! ! ! ‣そうしないように修正するしかない $code
= "red"; $color_{$code} = "..."; //$color_red = .. $name = "Login"; $action = new {$name}Action(); //LoginAction
49.
PHP をまともに動かすまでの障壁 •文字化け •Quercus が解釈できないシンタックス •Quercus
で未対応な PHP 関数
50.
未対応な PHP 関数 •Quercus
は未実装関数を検知した場合、 UnimplementedException を投げる •特にマルチバイト系の関数(mb_****) の未実装 or 不備が 多い ‣mb_convert_kana : 未実装 ‣mb_send_mail : 不備 ‣mb_encode_numericentity : 未実装 などなど
51.
未対応な PHP 関数 •PHP
関数については同じ名前のメソッドがあ るのでわりとわかりやすい
52.
未対応な PHP 関数 •以下のいずれかで対応 ‣自力で
Quercus を改変してビルド ‣AOP でひっかけて実装 ‣PHP の呼び出し箇所を Java 化する
53.
PHP と Java
を 結合してみる
54.
PHP - Java
結合のポイント •セッション情報 ‣Quercus - JavaEE 間セッション情報共有 ‣セッションタイムアウト設定 •PHP ファイルの配置方法 •ビューレイアウト共有
55.
PHP - Java
結合のポイント •セッション情報 ‣Quercus - JavaEE 間セッション情報共有 ‣セッションタイムアウト設定 •PHP ファイルの配置方法 •ビューレイアウト共有
56.
Tomcat など PHP Java PHP
5.2 Spring など $_SESSION • Quercus を使っても、 PHP のセッションと Java のセッションは別空間 になる ! HttpSession
57.
Tomcat など PHP Java PHP
5.2 Spring など $_SESSION • Quercus を使っても、 PHP のセッションと Java のセッションは別空間 になる • なんらかの方法で、2つの空間を同期する仕組みが 必要 HttpSession
58.
Quercus-JavaEE セッション情報共有 •Quercus から
HttpSession は参照できる •PHP の auto_prepend 及び auto_append のしく みが Quercus でも使えるのでこれで同期 ‣auto_prepend ‣ Java(HttpSession) → PHP($_SESSION) ‣auto_append ‣ PHP($_SESSION) → Java(HttpSession)
59.
auto_prepend/auto_append で同期 QuercusServlet Tomcat など xxxx.php php.ini
60.
auto_prepend.php auto_prepend/auto_append で同期 QuercusServlet Tomcat など xxxx.php php.ini auto_append.php PHP($_SESSION)
→ Java(HttpSession) Java(HttpSession) → PHP($_SESSION)
61.
auto_prepend/auto_append で同期 •php.ini に以下のように記述 auto_prepend_file=/path/to/before.php auto_append_file=/path/to/after.php [before.php:
Java -> PHP] <?php session_start(); $request = quercus_servlet_request(); $session = $request->getSession(); $keys = $session->getAttributeNames(); while ($keys->hasMoreElements()) { $key = $keys->nextElement(); $value = $session->getAttribute($key); $_SESSION[$key] = $value; } [after.php: PHP -> Java] <?php session_start(); $request = quercus_servlet_request(); $session = $request->getSession(); foreach ($_SESSION as $key => $value) { $session->setAttribute($key, $value); }
62.
Tomcat など PHP Java Quercus
Spring など $_SESSION • session-config ‣ HttpSession にのみ適用される ! ! ! ! HttpSession
63.
Tomcat など PHP Java Quercus
Spring など $_SESSION • session-config ‣ HttpSession にのみ適用される • Quercus 管理の PHP セッション ‣ デフォルト 30 分で変更する手段なし? ‣ リフレクションで変更して Quercus がもってい るタイマーを起動すればなんとかできる HttpSession
64.
セッションタイムアウト •アプリケーション起動時に 1 回
Quercus が もっているセッション管理のタイマーを起動 すれば OK •コードは長いので Gist に書きました ‣https://gist.github.com/roundrop/ 96edc5f4d7135e60a2d0
65.
PHP - Java
結合のポイント •セッション情報 ‣Quercus - JavaEE 間セッション情報共有 ‣セッションタイムアウト設定 •PHP ファイルの配置方法 •ビューレイアウト共有
66.
PHP ファイルの配置 既存 PHP Apache htdocs
(docルート) include 機能A index.php いろいろ汚いの 機能B
67.
PHP ファイルの配置 既存 PHP Apache htdocs
(docルート) include 機能A index.php いろいろ汚いの Java アプリ web ルート WEB-INF 機能B
68.
PHP ファイルの配置 既存 PHP Apache htdocs
(docルート) include 機能A index.php いろいろ汚いの Java アプリ web ルート WEB-INF 機能B
69.
PHP ファイルの配置 既存 PHP Apache htdocs
(docルート) include 機能A index.php いろいろ汚いの Java アプリ web ルート WEB-INF 機能A index.php いろいろ汚いの 機能B 機能B include ドキュメントルートをwebルートとして配置
70.
PHP ファイルの配置 既存 PHP Apache htdocs
(docルート) include 機能A index.php いろいろ汚いの Java アプリ web ルート WEB-INF 機能A index.php いろいろ汚いの 機能B 機能B include ドキュメントルートをwebルートとして配置
71.
PHP ファイルの配置 既存 PHP Apache htdocs
(docルート) include 機能A index.php いろいろ汚いの Java アプリ web ルート WEB-INF 機能A index.php いろいろ汚いの 機能B 機能B include ドキュメントルートをwebルートとして配置 web ルートがきたなくなる 一部階層関係がかわってしまう (この例だと htdocs と include)
72.
PHP ファイルの配置 •階層関係重要 •こういうのありがち ! ! ! ! •階層関係は変えないのが望ましい htdocs/sub/hoge.php ! <?php define('_ROOT', "../.."); define('_INCLUDE',
_ROOT."/include"); :
73.
PHP ファイルの配置 既存 PHP Apache htdocs
(docルート) include 機能A index.php いろいろ汚いの Java アプリ web ルート WEB-INF 機能B
74.
PHP ファイルの配置 既存 PHP Apache htdocs
(docルート) include 機能A index.php いろいろ汚いの Java アプリ web ルート WEB-INF 機能B php htdocs 機能A index.php いろいろ汚いの 機能B include 1つのディレクトリにそのままの構成で配置 Web サーバーで *.php を /php/htdocs へプロキシーする
75.
PHP ファイルの配置 •auto_prepend でサーバー変数を調整 $_SERVER['SCRIPT_NAME'] =
str_replace("/php/htdocs", "", $_SERVER['SCRIPT_NAME']); $_SERVER['SCRIPT_URL'] = str_replace("/php/htdocs", "", $_SERVER['SCRIPT_URL']); $_SERVER['REQUEST_URI'] = str_replace("/php/htdocs", "", $_SERVER['REQUEST_URI']); $_SERVER['PHP_SELF'] = str_replace("/php/htdocs", "", $_SERVER['PHP_SELF']); $_SERVER['DOCUMENT_ROOT'] = $_SERVER['DOCUMENT_ROOT']."php/htdocs/";
76.
PHP - Java
結合のポイント •セッション情報 ‣Quercus - JavaEE 間セッション情報共有 ‣セッションタイムアウト設定 •PHP ファイルの配置方法 •ビューテンプレート共有
77.
ビューテンプレート共有 •PHP と Java
の両方が動いているとはいえ、 サイトとしては 1 つで、デザインも同じ ‣サイトのヘッダーやフッターなどの部品は PHP と Java で共有したい ‣Java のテンプレートエンジンでデザインし て、PHP でもそれを使うのが理想
78.
ビューテンプレート共有 <?php : include_once 'header.php'; : [コンテンツ] : <header> デザインした内容 : : : <header th:include="header... : [コンテンツ] : <header> デザインした内容 : PHP
Java (Thymeleaf) header.php header.html
79.
ビューテンプレート共有 <?php : include_once 'header.php'; : [コンテンツ] : <header> デザインした内容 : : : <header th:include="header... : [コンテンツ] : <header> デザインした内容 : PHP
Java (Thymeleaf) header.php header.html デザインテンプレートが二重管理 DRY じゃない
80.
ビューテンプレート共有 <?php : include_once 'header.php'; : [コンテンツ] : : : <header th:include="header... : [コンテンツ] : PHP
Java (Thymeleaf) <header> デザインした内容 : <?php import aa.bb.XxxReader; print XxxReader::readHeader(); header.php header.html
81.
: : <header th:include="header... : [コンテンツ] : ビューテンプレート共有 <?php : include_once 'header.php'; : [コンテンツ] : PHP
Java (Thymeleaf) <header> デザインした内容 : <?php import aa.bb.XxxReader; print XxxReader::readHeader(); header.php header.html PHP では ・Java テンプレートエンジンの html ファイルを読み込み ・テンプレートエンジン特有のアトリビュート(th: 等)を削除 ・static 変数にキャッシュするなど
82.
その他
83.
その他 •PHP の一部を Java
に置き換える •ロギング •コネクションプーリング
84.
その他 •PHP の一部を Java
に置き換える •ロギング •コネクションプーリング
85.
PHP の一部を Java
に置き換える •PHP から Java を扱う ‣http://quercus.caucho.com/quercus-3.1/doc/ quercus.xtp#JavaPHPintegration •import して使う方法 ! ! •new Java(“…”) する方法 <?php import java.util.Date; $a = new Date(123); <?php $a = new Java("java.util.Date", 123);
86.
: <?php if ($user->is_premium) { : ?> <div><?php
echo $user->name; ?></div> <div>ここに表示項目を追加したい</div> : PHP の一部を Java に置き換える
87.
PHP の一部を Java
に置き換える : <?php if ($user->is_premium) { : ?> <div><?php echo $user->name; ?></div> <?php import com.example.helper.StatusHelper; ?> <div><?php echo StatusHelper::getLabel($user->status); ?></div> :
88.
PHP の一部を Java
に置き換える •Java の型 → PHP の型 の変換ルール ‣ http://quercus.caucho.com/quercus-3.1/doc/ quercus.xtp#MarshallingPHPtoJavaconversions ‣ 例えば java.util.List は array になる <?php import com.example.php.ContactLogic; $logic = new ContactLogic(); $recents = $logic->getRecents(); foreach ($recents as $contact) { $from = $contact["from"]; public final class ContactLogic { : public List<Contact> getRecents() { :
89.
その他 •PHP の一部を Java
に置き換える •ロギング •コネクションプーリング
90.
ロギング •Quercus 内部では java.util.logging
が使われている •error_log 関数については、ログタイプ=0 の場合、 error_log ディレクティブに “syslog” を指定すると java.util.logging.Logger で出力される ! ! •jul-to-slf4j を使って SLF4J に集約するとよい <?php ini_set("error_log", "syslog"); error_log("メッセージ", 0);
91.
その他 •PHP の一部を Java
に置き換える •ロギング •コネクションプーリング
92.
コネクションプーリング •Quercus ならではの強力機能! •mysql_connect(), pg_connect()
や PDO で JNDI から接続をとってきて使用できる ‣ $con = pg_connect(“java:comp/env/jdbc/mydb”); ‣ $pdo = new PDO(“pgsql:java:comp/env/jdbc/mydb”); ※PDO の場合は先頭に「データベース名:」が必要なので注意
93.
コネクションプーリング •Web サーバーのContext に
jdbc リソースを追 加 •web.xml に以下を記述 <servlet> <servlet-name>quercusServlet</servlet-name> <servlet-class> com.caucho.quercus.servlet.QuercusServlet </servlet-class> : <init-param> <param-name>database</param-name> <param-value>jdbc/mydb</param-value> </init-param> :
94.
Maven 形式 /
JDK 7 でビルド可能な Quercus を GitHub に置いています https://github.com/roundrop/quercus ! (サンプルコードもそのうち GitHub に置きます)
95.
まとめ •Quercus けっこううまく動く •でも完璧ではないので、プロダクションレベ ルで適用するには多少の労力をかける必要は ある •うまくハマれば「段階的に」PHP→Java へ進 化させられる
96.
ありがとうございました
Baixar agora