More Related Content
PPTX
Biodiesel from Waste Chicken Fats by Base Tranesterification Using Microwave ... PDF
PDF
Html5で作るiPhoneアプリケーション2010 PPTX
第1回 始めてみよう Web 動画 〜 基礎編 まずは iPhone から PDF
(エンジニアから見た)
最近のスマートウォッチ事情 PDF
<Yahoo!プロモーション広告>「iPhone 6」発売後はどうなる? 関連キーワード検索傾向 PDF
PDF
「iPhone 6s/6s Plus」発売前後の検索実績からみる、インターネットユーザー動向 Viewers also liked
PPTX
Java ScriptでつくるはじめてのiPhoneAndroidゲーム開発体験ハンズオン KEY
iPhoneアプリ開発を楽に楽しくするサイトまとめ PDF
PDF
Phone Appli「PA Sync」 説明資料 PDF
Office for iPad Office for iPhone 企業利用における問題点のまとめ PDF
PPTX
iPhone 5 の Wi-Fi ちゃんと動いてましたか? #yidev PDF
非It系総務の社内kintone促進 kintone Café japan PDF
女性はグリー、男性はモバゲーのアプリデザインを支持!! -iphoneアプリデザイン調査- KEY
ニコニコ動画iPhoneアプリの作り方@スマートフォン2011講演資料 PDF
Rubyを楽しくする第一歩!ブロックを理解する! PDF
iPhoneアプリ無料でできるプロモーション15の活動 PDF
JavaエンタープライズアーキテクチャにおけるHTML5 - Enterprise ☓ HTML5 Web Application Conference ... PDF
PDF
PPTX
【保存版】Youtube・動画マーケティング・コンテンツマーケティングの最新情報を入手できる有力な情報源まとめ PDF
Apple信者だったボクは気づくとiPhone嫌いになっていたんだが 〜iPhone 6 Plusへの苦悩の日々 PDF
Similar to PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PDF
PDF
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情 PDF
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj PDF
PDF
最新PHP事情 (2000年7月22日,PHPカンファレンス) PDF
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese) PDF
PHP-FPMとuWSGI——mod_php以外の選択肢を探る PDF
PDF
PDF
PPTX
20201107 jjug ccc Spring Boot ユーザーのための Quarkus 入門 PPTX
Spring Boot ユーザの方のための Quarkus 入門 PDF
PDF
PPT
PDF
PDF
PDF
PHPの今とこれから2024 at PHP Conference Japan 2024 PPT
PDF
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
- 1.
PHP in Java-Quercus- による
レガシーマイグレーション
山下 竜司
株式会社アットウェア/Facebook4J
#jjug_ccc #ccc_r12
- 2.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
Quercus
•PHP (PHP5 相当)を Java 上で動かすことを
可能にする Java で実装されたエンジン
•オープンソース (ライセンスは GPL)
•Caucho Technology 社の商用アプリケーショ
ンサーバー Resin の一部
- 14.
- 15.
- 16.
- 17.
- 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.
- 20.
PHP コードの再現力
•Quercus のPHP 再現力はかなりのもの
•(モノによるが) だいたい 90% 以上のコード
は動く
•逆に言うとある程度は改修・実装が必要
‣Quercus で未実装の PHP 関数の自前実装
‣対応していないシンタックスを調整 など
- 21.
- 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.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
Java Application Server
(Tomcatなど)
PHP
Java
(Spring等)
既存機能はPHPのまま 新機能はJava
あまりにひどい部分だけ Java 化
性能上のボトルネックだけ Java 化
スモールスタートしてから徐々に Java の範囲を
広げていき、最終的には PHP をなくす
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 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.
- 44.
- 45.
- 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.
- 48.
- 49.
- 50.
未対応な PHP 関数
•Quercusは未実装関数を検知した場合、
UnimplementedException を投げる
•特にマルチバイト系の関数(mb_****) の未実装 or 不備が
多い
‣mb_convert_kana : 未実装
‣mb_send_mail : 不備
‣mb_encode_numericentity : 未実装 などなど
- 51.
- 52.
- 53.
- 54.
PHP - Java結合のポイント
•セッション情報
‣Quercus - JavaEE 間セッション情報共有
‣セッションタイムアウト設定
•PHP ファイルの配置方法
•ビューレイアウト共有
- 55.
PHP - Java結合のポイント
•セッション情報
‣Quercus - JavaEE 間セッション情報共有
‣セッションタイムアウト設定
•PHP ファイルの配置方法
•ビューレイアウト共有
- 56.
- 57.
Tomcat など
PHP Java
PHP5.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.
- 60.
- 61.
- 62.
- 63.
Tomcat など
PHP Java
QuercusSpring など
$_SESSION
• session-config
‣ HttpSession にのみ適用される
• Quercus 管理の PHP セッション
‣ デフォルト 30 分で変更する手段なし?
‣ リフレクションで変更して Quercus がもってい
るタイマーを起動すればなんとかできる
HttpSession
- 64.
- 65.
PHP - Java結合のポイント
•セッション情報
‣Quercus - JavaEE 間セッション情報共有
‣セッションタイムアウト設定
•PHP ファイルの配置方法
•ビューレイアウト共有
- 66.
- 67.
- 68.
- 69.
- 70.
- 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.
- 73.
- 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.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 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.
- 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.
- 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.
- 92.
- 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.
- 96.