ようこそ!浜村拓夫の世界へ

    ブログ内検索

    最近の記事

    最新の広告

    VPSでWebサイトを作る


    ドメイン名を取得する


    プログラミングの質問サービス


    Blog Translation

    Powered By FC2ブログ

    Powered By FC2ブログ
    ブログやるならFC2ブログ


    FC2ブログ LOGIN

    FC2ブログ 管理画面


    with Ajax Amazon

    XAMPPでPHPの更新がすぐに反映されない場合の対策

    このエントリーをはてなブックマークに追加
    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 で利用可能です。



    PHP 5.5ネーティブキャッシュの話 from Rui Hirokawa


    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を有効にしておいた方が良さそうですね!


    詳細! PHP 7+MySQL 入門ノート
    大重 美幸
    ソーテック社
    2016/7/1
    ¥ 3,218


    このエントリーをはてなブックマークに追加

    PHPで配列を保存するとき、データ容量はserializeとJSONでどちらが少ないか?

    このエントリーをはてなブックマークに追加
    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        248926
    json_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でどちらが少ないか?”の続きを読む】
    このエントリーをはてなブックマークに追加

    CodeIgniter2.1 エラー改善策 (Only variable references should be returned by reference)

    このエントリーをはてなブックマークに追加
    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 デバッグ入門 (Zendシリーズ)

    イグアス
    2016-02-23
    Kindle版 ¥ 2,500

    このエントリーをはてなブックマークに追加

    PHPの「debuglib」で配列データを見やすく表示

    このエントリーをはてなブックマークに追加
    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()関数を活用すると楽になります。

    PHP デバッグ入門 (Zendシリーズ)

    イグアス
    2016-02-23
    Kindle版 ¥ 2,500

    このエントリーをはてなブックマークに追加

    はてなブックマークのRSSをPHPで取得する方法

    このエントリーをはてなブックマークに追加
    はてなブックマークの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);
    ?>



    ~短期集中講座~ 土日でわかる PHPプログラミング教室 環境づくりからWebアプリが動くまでの2日間コース
    フロイデ株式会社 吉谷 愛
    SBクリエイティブ
    2015-11-26
    ¥ 2,452



    PHP逆引きレシピ 第2版 (PROGRAMMER’S RECiPE)
    鈴木 憲治 / 山田 直明 / 山本 義之 / 浅野 仁 / 櫻井 雄大 / 安藤 建一
    翔泳社
    2013-10-22
    ¥ 3,024


    このエントリーをはてなブックマークに追加

    無料のアクセス解析ツール Piwik

    このエントリーをはてなブックマークに追加
    ある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が見やすいかんじですね?

    試しに使ってみて、自分好みに改造したら良いかも。



    このエントリーをはてなブックマークに追加

    FuelPHPインストールでGitHubのトークンが必要になった

    このエントリーをはてなブックマークに追加
    はじめてのフレームワークとしてのFuelPHP」という本を読んで、FuelPHPの使い方を勉強しています。

    はじめてのフレームワークとしてのFuelPHP 改訂版
    鈴木 憲治
    ラトルズ
    2014-10-25
    ¥ 3,758


    ●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の使い方も、ついでに勉強しておこうと思います。

    Web制作者のためのGitHubの教科書 チームの効率を最大化する共同開発ツール
    塩谷 啓 / 紫竹 佑騎 / 原 一成 / 平木 聡
    インプレス
    2014-10-24
    ¥ 2,376


    ちなみに、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の使い方を勉強しています。

    はじめてのフレームワークとしてのFuelPHP 改訂版
    鈴木 憲治
    ラトルズ
    2014-10-25
    ¥ 3,758


    ●メーリングリスト
    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について、分からないことがあったら、ここで聞いてみたらいいですね?

    このエントリーをはてなブックマークに追加

    はじめてのフレームワークとしてのFuelPHP

    このエントリーをはてなブックマークに追加
    PHPでWebサイトを作るとき、CodeIgniterの代わりに、FuelPHPを使ってみようと思います。
    はじめてのフレームワークとしてのFuelPHP」という本を買ってみました。

    はじめてのフレームワークとしてのFuelPHP 改訂版
    鈴木 憲治
    ラトルズ
    2014-10-25
    ¥ 3,758


    ●目次

    (参考)
    ラトルズネット / はじめてのフレームワークとしての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にないセキュリティ機能」という資料がありました。
    PHPユーザーは、一読しておいた方が良いと思いました。

    PHPにないセキュリティ機能 from Yasuo Ohgaki


    いきなりはじめるPHP~ワクワク・ドキドキの入門教室~
    谷藤賢一
    リックテレコム
    2011-12-09
    ¥ 1,944

    このエントリーをはてなブックマークに追加