Webサイトの開発で、XAMPPを使っていたら、PHPコードの変更がすぐに反映されなくて困りました。
調べてみたら、PHPの「Zend OPcache」が有効になっていて、コード変更の反映にタイムラグが生じていました。
→修正方法をメモ。
●Zend OPcacheとは? PHP: OPcache 導入 - Manual OPcache はコンパイル済みのバイトコードを共有メモリに保存 し、PHP がリクエストのたびにスクリプトを読み込み、パースする手間を省く ことでパフォーマンスを向上させます。 このPHP拡張モジュールは PHP 5.5.0 以降のバージョンにバンドルされています。 PHP 5.2, 5.3, 5.4 では PECL で利用可能です。
OPcacheを有効にすると、変更したスクリプトを読み込むのではなく、すでに蓄積されているキャッシュのバイトコードの方を読み込んでしまい、変更がすぐに反映されていない状態になっていたんですね!
phpinfo()でPHPの設定を確認してみます。
opcache.enable On
確かに、「opcache.enable」という項目があり、オプションが「On」になっていました。
開発環境では、「opcache.enable」を「Off」にしておきましょう。
●PHPバイトコードのキャッシュ生成を無効化 Zend OPcacheを開発環境で無効にする | Webエンジニアブログ ini_set('opcache.enable', 0); PHPのエントリーポイント(最初に実行される部分)に、この1行を入れておけば、とりあえず開発環境ではOPcacheを無効化できました。
めでたし、めでたし!
opcache.enable 無効化 - Google 検索 検索してみたら、たくさん対策がヒットしたので、いろんな人が困っていたみたいですねw
ini_set()を使って、とりあえず設定を変えるだけでもOKですが、ちゃんとやるならPHP設定ファイル「php.ini」の該当ディレクティブを書き換えておくべきでしょう。
●Zend OPcacheの役割 Zend OPcacheは、中間コードのキャッシュだけでなく、コードの最適化も行ってくれるそうです。
PHP 5.5 を使った時にキャッシュが効いてプログラムの変更が即、反映されなかった - 強火で進め OPcacheはその名前とは異なり、キャッシュ処理だけではなく、コードの最適化もしてくれるみたいです。 その為、キャッシュはさせたくないけど最適化の恩恵は受けたいという場合にはOPcacheを無効にするのでは無く、更新チェック頻度の指定(秒)を0( opcache.revalidate_freq=0 )にして対応するのが良いでしょう。 後、プログラム内で強制的に更新させたい場合には opcache_reset() や opcache_invalidate() 関数で行えます。
なるほど。
公開サーバーでは、PHPのZend OPcacheを有効にしておいた方が良さそうですね!
Amazon APIで取得したレスポンスデータを連想配列に変換して、DBに保存します。
配列を保存するために、serialize関数でバイナリーデータにした場合と、JSON形式のテキストデータにした場合では、どちらが容量が小さくできるか?調査してみました。
PHP 配列 保存 JSON serialize 容量 比較 - Google 検索 ↓
PHPで配列をそのままテキストにシリアライズとjson_encodeで行う | 9ineBB シリアライズとJSONの違い シリアライズされたものをデータベースに保存したい場合はテキスト型ではなくBLOB型に入れなくてはいけないこと、またシリアライズされたものは英数字のみの配列ならJSONよりも容量が大きくなる。 JSONの場合はデータベースにテキスト型で保存することが出来る、また英数字のみの配列ならシリアライズより容量を抑えれる、ただマルチバイト文字になると容量はシリアライズよりも大きくなり 、デコード時間もシリアライズより掛かる。
・英数字のみ → シリアライズ > JSON
・マルチバイト文字 → JSON > シリアライズ
serializeとjson関数の比較 - Web就活日記 エンコードbyte数比較 php配列からのエンコード処理ではjson_encodeの方が生成Stringのバイト数が少なく済みそう 形式 シングルバイト マルチバイト serialize 178919 248926json_encode 70008 230024
・シリアライズ > JSON
serialize VS json_encode 〜人類の存亡とか仁義とか全く関係ない戦い〜 | 日記の間 | あかつきのお宿 json_encodeでマルチバイト文字をエスケープしたときって、「u3042」みたいに、一文字が5バイトになるのよ。通常、UTF-8のマルチバイト文字は3バイトだから、マルチバイト文字を多く含むデータを変換した場合は、json_encodeの方がデータ量が多くなる。
PHP: 定義済み定数 - Manual JSON_UNESCAPED_UNICODE (integer) マルチバイト Unicode 文字をそのままの形式で扱います (デフォルトでは \uXXXX にエスケープします)。 PHP 5.4.0 以降で使用可能です。
PHP5.4以降では、配列をJSON形式にエンコードするとき、マルチバイト文字をエスケープしないオプションが用意されていました。
「JSON_UNESCAPED_UNICODE」を指定してやれば、マルチバイト文字をそのままDBに保存できるので、データ容量の増加を多少は抑えられるでしょう。
PHPで配列を保存するとき、容量を小さくしたければ、
・JSON形式
・マルチバイト文字をエスケープしない設定
でOKかな?
(処理速度を重視する場合は、シリアライズでOK)
【“PHPで配列を保存するとき、データ容量はserializeとJSONでどちらが少ないか?”の続きを読む】
CodeIgniterのシステムをメンテナンスしていたらエラーが発生しました。
PHPで「Only variable references should be returned by reference」というエラーメッセージが出ました。
検索したら、すぐに解決策が見つかりました。
CodeIgniter - new document A PHP Error was encountered Severity: Notice Message: Only variable references should be returned by reference Filename: core/Common.php Line Number: 257
Codeigniter 2.1.4 and php5.6 / Forums / Community / EllisLab BEFORE CHANGE: return $_config[0] =& $config; AFTER CHANGE: $_config[0] =& $config; return $_config[0];
上記のように、1行の記述を2行に分けたら改善されました!
(参考)
codeigniter2.2 エラー対応(Only variable references should be returned by reference) - kikeda1104's blog PHP4なスクリプトをPHP5へ移行する際に発生する7つの問題 - Shin x blog
PHPで配列データをデバッグ表示するとき、見やすく整形してくれる「debuglib」というライブラリーがありました。
●紹介記事 PHPで使えるdebugライブラリまとめ - Qiita PHPのデバッグに便利な関数 – 応用編 - EC studio 技術ブログ ●ダウンロード GitHub - fabioalvaro/debuglib: debuglib as replace of var_dump but better ●CodeIgniter debuglibをCodeIgniterに組み込んで使う方法も紹介されていました。
PHP/CodeIgniter/debuglib_helper - TOBY SOFT wiki ●詳細設定 debuglibでprint_a()関数を使う場合、オプションが設定できます。
Debuglib for PHP5 print_a(mixed input[, string option_string]) option_string must be in the css like syntax: eg. "max_y:5;window:1;label:my_array" possible options: return: (01) do not print the output and instead return it as a string help: (1) show this text label: (string) draw a fieldset/legend around the output max_y: (1-n) maximum number of items on the same level. [...] pickle: (0|1) print a serialized representation of the array instead of printing it as a table trim_tabs: (0-n) trim the leading tabs in multiline strings and pad with n tabs window: (string) the output should open in a new window (javascript), the parameter is also the title for the window avoid@: (0|1) if a key starts with the character "@", assume it is a recursive reference and don't follow it
print_a($array); と書くと、そのまま表示されてしまいますが、
print_a($array, "return:1;"); のように書くと、HTMLの文字列として返されます。
$html_array = print_a($array, "return:1;"); echo $html_array; のように、後でまとめて表示したいとき等には、オプションを設定して使えばOK。
Amazon APIのレスポンスデータをXML形式で受け取り、PHPで配列データに変換して、ブラウザー上で表示させました。
PHPの標準関数「print_r()」や「var_dump()」で配列データを出力した結果を、さらに「<pre>~</pre>」タグで挟んだけでも多少は見やすくなるのですが、データ量がでかくなるとさすがに見づらくなるので、debuglibのprint_a()関数を活用すると楽になります。
はてなブックマークのRSSデータをPHPで取得していましたが、正常に取得できなくなっていたので、仕組みを調査しました。
結論から言うと、はてな側が、ユーザーエージェントでアクセス制限していたようです。
ユーザーエージェントを指定してアクセスする方法に変更したら、RSSデータを取得できるようになりました。
(参考)
はてなブックマークの RSS を Ruby で取得していたのですが、この頃 503 エラーが出るようになってしまい正しく取得出来ません。 - 人力検索はてな どなたか原因をご存知の方、あるいは RSS を取得出来る方法をご存知の方はいらっしゃいますか? User Agent をチェックしてるみたいです。 偽装したら取得できました。
PHP simplexml_load_fileはUAを送信していない(UA偽装してXMLを取得・解析) simplexml_load_file は UserAgentを送信してないため、 Shift_JIS のレスポンスヘッダを受け取ってエラーになっている。 対処法はUA偽装したstream_context_createでXMLの文字列を取得した後SimpleXMLElementオブジェクトに格納してXML解析? $context = stream_context_create(array('http' => array( 'method' => 'GET', 'header' => 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)', ))); $url = "http://hain.jp"; $data = file_get_contents($url, false, $context);
simplexml_load_file()で特定サイトのrssが取れない | For Want Of A Better Word $agent = stream_context_create(array('http'=>array('user_agent'=>'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0)'))); //IE9 $data = file_get_contents("ロードしたいURL", false, $agent); $tmp = "./tmpdata"; file_put_contents($tmp, $data); //ファイル作成 $rss = simplexml_load_file($tmp); unlink ($tmp);
↑テキストファイル($tmp)を1回作るのが冗長ですね?
ユーザーエージェントの指定部分($agent)だけ参考にしてみます。
単純にPHPのsimplexml_load_file()関数で、RSSを取得しようとすると、ユーザーエージェントのデータを送っていないので、ユーザーエージェントの判別処理か何かで、アクセスをはじかれているようです。
(面倒くさいので、サーバーログを見ていないw)
サンプルコードにあった、ユーザーエージェントのデータを送る方式にしたら、うまくRSSを取得できるようになりました。
=修正成功!
(例) こんなかんじです。
<?php $tag = "google"; $users = 100; $rss = "http://b.hatena.ne.jp/search/tag?mode=rss&users=".$users."&q=".urlencode($tag); //before //$xml = simplexml_load_file($rss); //after $agent = stream_context_create(array('http'=>array('user_agent'=>'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0)'))); //IE9 $str = file_get_contents($rss, false, $agent); $xml = simplexml_load_string($str); ?>
あるWebサイトのソースコードを見たら、Piwikというアクセス解析のコードが貼られていました。
Piwik - Wikipedia Piwikは世界中の開発者チームによって開発された、PHP/MySQLサーバー上で動作するウェブ解析用オープンソースソフトウェア である。 45言語以上翻訳されており、48万以上のウェブサイト(総数の1.2%)で使用されている。 新バージョンは、定期的に数週間ごとに提供されている。 1サイト以上の訪問者を追跡し、分析レポートの表示機能を有する。
・公式サイト
Piwik - Free Web Analytics Software ・日本語サイト
日本Piwikユーザー会 ●インストール方法 Piwikをインストールしてアクセスログ解析 | VPSサーバーでWebサイト公開 備忘録 ~Linux、MySQLからAJAXまで PiwikでGoogle Analyticsを超えるアクセス解析を実現 | 株式会社みどりの技術者ラボ 管理画面のUIが見やすいかんじですね?
試しに使ってみて、自分好みに改造したら良いかも。
VIDEO
「
はじめてのフレームワークとしてのFuelPHP 」という本を読んで、
FuelPHP の使い方を勉強しています。
●Composerで問題発生 はじめてのフレームワークとしてのFuelPHP のp.64の部分で問題が発生しました。
(p.64)
3.2.1 手順1 FuelPHPのインストール FuelPHP1.6からComposerが正式採用され、一部のライブラリがComposerで管理されるようになり、1.7.2からはFuelPHPのサブリポジトリもComposer経由でインストールされるようになりました。
NOTE Composerとは? ComposerはPHPの新しいパッケージ(ライブラリ)管理ツールです。PHP5.3.2以降で利用できます。プロジェクトごとに必要なパッケージを管理できます。公式サイトは、http://getcomposer.org/ です。
Composer Composer ドキュメント日本語訳 ComposerはPHPの依存管理ツールです。 Composerはあなたのプロジェクトが必要とする依存ライブラリを定義できるようにして、インストールを行います。 このアイデアは新しいものではありません。 Composerはnodeのnpmやrubyのbundlerに強くインスパイアされています。 しかし、PHPにはそのようなツールがありませんでした。
(p.64)
まず、self-updateコマンドでcomposer.phar自体を更新し、updateコマンドで必要なパッケージをComposer経由でダウンロードします。 $ cd fuelphp $ php composer.phar self-update $ php composer.phar update
Windowsのコマンドプロンプトで、FuelPHPをインストールしたフォルダに移動します。
それから、上記のコマンドを打ちました。
$ php composer.phar update
をやったら、途中で
Could not fetch https://api.github.com/repos/fuel/docs, please create a GitHub OAuth token to go over the API rate limit Head to https://github.com/settings/tokens/new?scopes=repo&description=Composer+on+username-PC+2015-09-21+0855 to retrieve a token. It will be stored in "C:/Users/username/AppData/Roaming/Composer/auth.json" for future use by Composer. Token (hidden):
というメッセージが出てきました。
トークンなんて知らんので、何も文字を入力しないで、そのままエンターキーを押しました。
そしたら、
No token given, aborting. You can also add it manually later by using "composer config github-oauth.github.com "
というメッセージが出てきて、処理が続行されませんでした。
「何なのコレ、困るよねー?」
と思って検索したら、解決方法が紹介されていました。
tokenを聞かれFuelPHP 1.7.3がうまくインストールできない場合 — A Day in Serenity (Reloaded) — PHP, FuelPHP, Linux or something お世話になります。 fuelphpをcentosにインストールしたいのです… - 人力検索はてな 【FuelPHP】インストール時にtokenを聞かれてしまうエラー Composer が GitHub の API を使っていますが、それが rate limit に引っかかったということみたいです。 時間が経てば制限が解除されてまたダウンロードできるようになりますが、レート制限を緩和するためにトークンをつくり設定する ということみたいです。 と、いうことでトークンを作ってみた。 githubにログインして https://github.com/settings/tokens [Personal settings] – [Personal access tokens]から[Generate new token]でトークンを作成。 作成したトークンを貼り付けたら無事に進みました。
・GitHubで、アカウントを作成して、ログインする。 ・GitHubで、トークンを作成して、貼り付ければOK。 とのこと。
GitHubの使い方も、ついでに勉強しておこうと思います。
ちなみに、Composerでライブラリの更新ができていなかったとき(更新を飛ばして)、そのままFuelPHPのトップページを表示させようとすると、次のようなエラーメッセージが出ました。
No composer autoloader found. Please run composer to install the FuelPHP framework dependencies first!
このエラーメッセージも検索したら、解決方法が紹介されていました。
FuelPHP1.6に更新したら、Composer is not installed エラー。 – AH-2 FuelPHPをレンタルサーバー上に設置する場合の注意点(v1.7.2) - m6uとFuelPHP 要するに、上記のComposerでライブラリを更新する作業をやらないとダメってことですね。
(無理矢理突破するなら、FuelPHPのZIPファイルをダウンロードして設置すればいいみたいです。)
FuelPHPは、融通の利かないフレームワークですね?(><)
「
はじめてのフレームワークとしてのFuelPHP 」という本を読んで、
FuelPHP の使い方を勉強しています。
●メーリングリスト FuelPHPについて質問ができるメーリングリストが紹介されていました。
(p.11)
1.6.2 質問する fuelphp.jp Googleグループ ・https://groups.google.com/group/fuelphp_jp?hl=ja 2012年1月に作成された、FuelPHPのユーザが日本語で情報交換するためのGoogleグループ(メーリングリスト)です。 2014年7月14日現在、453人のユーザが参加しており、FuelPHPに関して日本語でやりとりできる最大のコミュニティになっています。
FuelPHPについて、分からないことがあったら、ここで聞いてみたらいいですね?
PHPでWebサイトを作るとき、
CodeIgniter の代わりに、
FuelPHP を使ってみようと思います。
「
はじめてのフレームワークとしてのFuelPHP 」という本を買ってみました。
●目次 (参考)
ラトルズネット / はじめてのフレームワークとしてのFuelPHP 改訂版 はじめに 第1部 環境構築編 第1章 FuelPHPとは? 第2章 PHP開発環境の構築 第3章 FuelPHPのインストール設定 第4章 NetBeansの使い方 第2部 入門編 第5章 はじめてのFuelPHP 第6章 FuelPHPのMVC 第7章 FuelPHPの機能概要 第8章 FuelPHPの拡張 第9章 FuelPHPでのユニットテスト 第3部 実践編 第10章 コンタクトフォームの作成 第11章 コンタクトフォームの改良 第12章 コンタクトフォームのリファクタリング 第13章 データベースの使用 第14章 管理ページの作成 第15章 コントローラのユニットテスト 第16章 コードカバレッジ解析 付録A 本番環境へのデプロイ時の注意点 付録B 参考文献
第4章は、「NetBeansの設定」ではなく、「NetBeansの使い方」になっていました。
とりあえず、この本を読んで、FuelPHPを試してみよう!
【“はじめてのフレームワークとしてのFuelPHP”の続きを読む】
「PHPにないセキュリティ機能」という資料がありました。
PHPユーザーは、一読しておいた方が良いと思いました。