タグ

ブックマーク / hnw.hatenablog.com (42)

  • 第七回闇PHP勉強会でrealpathキャッシュとデプロイの話をしました - hnwの日記

    昨日12月11日に第七回闇PHP勉強会を開催いたしました。私を含め発表者6人ということで、とても盛り上がった勉強会になりました。発表者の皆さま、またご参加いただいた皆さま、当にありがとうございました。また会場提供いただいたピクシブ株式会社さまにも大変お世話になりました。 以下が私の発表資料です。 PHPアプリケーションをsymlink切り替えでデプロイしているとrealpathキャッシュ絡みで何かしらトラブルがありますよね、というくくりで複数のトピックを紹介するような内容でした。タイトルの通り、一番話したかったのはmod_phpphp-fpmとでOPcacheの挙動が変わる話だったんですが、かなり入り組んだ内容だったのでうまく伝わらなかったかもしれません。 質問タイムに、@edvakfさんから面白いエピソードを聞くことができました。Pixivではこの手の問題に一通りハマった結果、現在で

    第七回闇PHP勉強会でrealpathキャッシュとデプロイの話をしました - hnwの日記
    hiro_y
    hiro_y 2016/12/12
  • php-timecopをPHP 7対応させてみた - hnwの日記

    自作のPHP拡張であるphp-timecopをPHP 7に対応させてみました。この機会に改めてphp-timecopの紹介をしてみます。 php-timecopとは php-timecopというのは筆者が4年ほど前に作ったPHP拡張で、現在時刻に紐付いた値を返すPHP関数について、基準となる現在時刻を過去や未来の任意の時刻に設定することができるというものです。 以下に簡単な例を紹介します。 <?php var_dump(date("Y-m-d")); // 今日の日付 timecop_freeze(0); var_dump(gmdate("Y-m-d H:i:s")); // string(19) "1970-01-01 00:00:00" var_dump(strtotime("+100000 sec")); // int(100000) 上記プログラム中2行目のtimecop_free

    php-timecopをPHP 7対応させてみた - hnwの日記
    hiro_y
    hiro_y 2016/04/19
  • PHPで巨大な整数をカンマ区切りするのにnumber_format関数は使えない - hnwの日記

    PHPには、数値を3桁区切りで表示するための組み込み関数としてnumber_format()が用意されています。 number_format — 数字を千位毎にグループ化してフォーマットする string number_format ( float $number [, int $decimals = 0 ] ) http://php.net/manual/ja/function.number-format.php この関数は金額を表示するような場合に便利です。 <?php $money = 1000; printf("財布の中に%s円あります。\n", number_format($money)); /* 財布の中に1,000円あります。 */ このように金額がカンマ区切りで表示されていると見やすくていいですよね。 ところで、このnumber_format()の第一引数はfloat型です

    PHPで巨大な整数をカンマ区切りするのにnumber_format関数は使えない - hnwの日記
    hiro_y
    hiro_y 2015/05/26
  • PHP7で変わること - hnwの日記

    次の土曜日5/30のPHPカンファレンス関西2015で基調講演(10:30-11:15)をさせて頂くことになりました。タイトルは「PHP7で変わること——言語仕様とエンジンの改善ポイント」です。チケットは既に売り切れているそうですが、参加者の方は早起きして来て頂けると幸いです。 このところQiitaに「PHP7調査」というシリーズを連投していたのも発表を意識してのことです。PHP7の新機能を一つずつ実際に試してみて、その結果を簡単にまとめていました。 今回は発表前の区切りとして、私の書いたPHP7関連の記事・プレゼン資料を一覧形式でまとめなおしてみます。PHPカンファレンス関西2015ではこれらの内容を踏まえつつ、気になる点を重点的にお伝えしたいと考えています。 内部実装のリファクタリング PHP7の目玉と言える、速度改善に関わる内容がほとんどです。 PHP7はなぜ速いのか - Slide

    PHP7で変わること - hnwの日記
    hiro_y
    hiro_y 2015/05/25
  • APCuは速いけど初期設定がイマイチだというお話 - hnwの日記

    ISUCON戦で惨敗してきた皆さんこんにちは。昨日のやけ酒は最高でしたね!今日はISUCON予選のときに気づいたAPCuのイマイチな点を紹介します。 APCuというのはPHP extensionで実装されているKVS(Key Value Store)で、localhost内でのデータキャッシュに利用されます。かなり高速な上、APCの時代から考えると利用実績も十分あるため、PHPでは定番extensionの一つといえるでしょう。 ところで、APCuに大量のデータ(10万エントリ以上)を格納するとデータの取得や更新が遅くなることがあります。APCuでは格納するエントリ数の「ヒント」をあらかじめ設定値で指定するようなつくりになっているのですが、この設定があまり知られておらず、デフォルト値もかなり小さいため、遅いまま使っている環境が多いように推測しています。 APCuの設定 APCuの設定値に、

    APCuは速いけど初期設定がイマイチだというお話 - hnwの日記
    hiro_y
    hiro_y 2014/11/11
  • PHPでHTTPの並行ダウンロードを実現する(Guzzle編) - hnwの日記

    PHPで最近注目のHTTPクライアントライブラリにGuzzleがあります。日での知名度はまだまだという印象ですが、かなり高機能かつ真面目にメンテナンスされている印象で、今後のデファクトスタンダードになりうるライブラリと言えるでしょう。 稿ではこのGuzzleを使ってWebサーバから並行にダウンロードする方法を紹介します。Webブラウザのように同時に複数コネクションを管理しながらKeep-Aliveでコネクションを使い回しますので、下手なコードで実現するより接続先Webサーバにも優しいはずです。 Guzzleの特徴 まずは、Guzzleについて僕が特徴的だと思う点を紹介します。 パッと見でわかりやすいインターフェース cURLは必須ではないがデフォルトでcURLを使う cURLの無い環境がありうるので、cURL無しでも動くのは嬉しい cURLのわかりにくいインターフェースを隠してくれるの

    PHPでHTTPの並行ダウンロードを実現する(Guzzle編) - hnwの日記
    hiro_y
    hiro_y 2014/08/25
  • PHP 5.4.4から==の挙動が一段と難しくなりました - hnwの日記

    PHPの==は両辺を適当に型キャストしてから比較するような演算子です。この型キャストの規則は難解すぎる上にドキュメントも不十分なため、PHPプログラマでも完璧に理解している人はほとんど居ないくらいの印象です。バグの原因になりかねないため、なるべく==を使わないようにしているPHPプログラマも多いはずです。 ところで、この==演算子の挙動がPHP 5.4.4から変更されていることはあまり知られていません。稿ではこの内容を紹介します。 Bug #54547 の騒動 まずはこの仕様変更の経緯を紹介します。 2年ほど昔、Hacker Newsで2^63付近の整数に対応する文字列をPHPで比較したときの挙動がおかしいというスレッドが盛り上がったことがありました。具体的には、PHPでは「'9223372036854775807' == '9223372036854775808'」がtrueになるとい

    PHP 5.4.4から==の挙動が一段と難しくなりました - hnwの日記
    hiro_y
    hiro_y 2014/08/10
  • PHPのジェネレータはイテレータより速い - hnwの日記

    先日の記事「PHPのジェネレータの実装を調べてみた」で僕は次のように書きました。 GeneratorクラスはIteratorインターフェースを実装しており、対応するPHPメソッドを持っています。また、Cで実装した場合のみ指定できるイテレータ関数も実装しています。このように両方が指定されている場合、foreachループではCの関数が呼ばれ、イテレータメソッドを明示的に指定した場合はPHPメソッドの方が呼ばれます。 ところで、イテレータに対応するPHPメソッドとC関数となぜ2つとも実装する必要があるのでしょうか。実は、PHPメソッドの方だけ実装すれば正常に動作します。C関数を実装する理由は速度面のメリットからだというのが僕の理解です。C関数は関数ポインタで単に呼び出せるのに対し、PHPメソッドの呼び出しは命令実行器の状態保存・復元の必要があるなど、呼び出しのコストがやや高いのです。 PHPのジ

    PHPのジェネレータはイテレータより速い - hnwの日記
    hiro_y
    hiro_y 2013/11/03
  • 第70回PHP勉強会で浮動小数点数の話をしました - hnwの日記

    7月22日に開催された第70回PHP勉強会で発表してきました。以下が発表資料です。 浮動小数点数周りのトピックを3点紹介する内容でしたが、思ったより反応が良かったように思います。 ただ、面白おかしく話そうとして、聞いている方々に無駄に恐怖を与えてしまったかもしれません。冷静に読み返していただければ、怖いように見える内容もレアケースの話題が多いことがわかるかと思います。 また、PDOの挙動については誤解を与えてしまったかと思いますので、プレゼン資料の25ページ目を大幅に差し替えてアップロードしました。 この点についてもう少し説明します。PDOでプリペアードクエリを利用する際、プレースホルダに値を埋め込むのにPDOStatement::bindValueメソッドを利用することができます。この際、bindValueメソッドの第3引数で利用でPDO::PARAM_INT定数を指定しても、第2引数の

    第70回PHP勉強会で浮動小数点数の話をしました - hnwの日記
    hiro_y
    hiro_y 2013/07/26
  • php-buildで複数バージョンのPHP-FPMを用意する - hnwの日記

    (2016/8/9)PHP7やHomebrewの現状に合わせるため細かい点を修正しました。 ついにPHP 5.5.0がリリースされましたね!これに関連して、php-buildを使ってPHP 5.3/5.4/5.5の3バージョンのPHP-FPM環境を用意する方法を紹介します。 この記事は「phpenv + php-build を使って 5.3 と 5.4 を共存させつつ php-fpm を使う - 肉とご飯と甘いもの @ sotarok」のアップデートのような内容になっています。ありがとうsotarok! PHP-FPMとは PHP-FPMPHPのSAPI実装の一つで、単体で動作するアプリケーションサーバです。Apacheなしで動くので、気軽に扱えたりします。あまりうまく説明できないので、詳しくはPHP-FPM家サイトあたりを見てください。 phpenv+php-buildのセットアップ

    php-buildで複数バージョンのPHP-FPMを用意する - hnwの日記
    hiro_y
    hiro_y 2013/06/27
  • PHPのロケールに関するまとめ - hnwの日記

    5/3 17:45追記:t_komuraさんに指摘いただいた関数と、さらに僕が調べ直したものを含め、「ロケール設定に従う関数一覧」に25個ほど追加しました。かなり見落としがありましたね…。 PHPのロケール*1まわりについて調査したので、これをまとめてみます。 この記事は「ロケールの影響を受ける関数 - Sarabande.jp」を掘り下げたものです。masakielasticさん、ナイスな記事をありがとうございます。 PHPの文字列型と文字エンコーディング 他のモダンなLL言語と異なり、PHPは文字列の文字エンコーディングに関して何も仮定せず、単なるバイト列として管理しています。つまり、文字エンコーディングの取り扱いは各関数の実装に委ねられています。 下記の通り、これはマニュアルにも記述があるのですが、実に残念なことです。 残念ながら、PHP の各関数が文字列のエンコーディングを判断する

    PHPのロケールに関するまとめ - hnwの日記
    hiro_y
    hiro_y 2012/05/01
    ロケール設定と影響範囲まとめ
  • GitHubへpull requestする際のベストプラクティス - hnwの日記

    みなさん、Git使ってますか?僕はまだメインのVCSがSubversionなのもあって、なかなか慣れません。せっかくGitを使っているのに、ちょっと不便なSubversionくらいの位置づけです。でも、同じような理解度の人って多いんじゃないでしょうか。 一方で、最近はGitHub管理のオープンソースプロジェクトが増えてきました。バグレポートを送るにしてもpull request*1が前提のような空気があり、Git初心者には少し敷居が高い印象があります。 そんな僕も先日初pull requestをしてみたんですが、色々な失敗の積み重ねで残念なpull requestになってしまいました。その反省を元に、稿ではpull requestする際のベストプラクティスを紹介します。これは「Git Workflow」をベースにコマンド例などを加筆したものです。 概要 pull requestする際は、

    GitHubへpull requestする際のベストプラクティス - hnwの日記
    hiro_y
    hiro_y 2012/02/28
    Git-Workflow使って
  • WebスクレイピングライブラリGoutteで遊んでみる - hnwの日記

    新年あけましておめでとうございます。今年もボチボチやっていきます。 稿ではPHP製のWebスクレイピングライブラリGoutteを紹介します。 Goutte(グット)とは Goutteは必要十分な機能を持ったWebスクレイピングライブラリです。そもそもWebスクレイピングというのは、外部Webページから必要なデータを取ってくるくらいの意味です。つまり、GoutteはWebスクレイピングを簡単に行う道具だと考えればいいでしょう。 具体的には、GoutteはWebクローラとHTMLパーサを組み合わせたようなものです。Cookieやフォームの扱いなどWebブラウザとしての機能は一通り揃っていますし、CSS風の要素指定もできるなど、機能面では他のライブラリと遜色ないように感じます。 さらに僕個人がGoutteに期待している点は、安定性とロングサポートです。Goutteは主要機能をSymfony2お

    WebスクレイピングライブラリGoutteで遊んでみる - hnwの日記
    hiro_y
    hiro_y 2012/02/22
    スクレイピングライブラリGoutteの使い方
  • 第4回Symfony2勉強会でLT発表してきました - hnwの日記

    去る6月4日、第4回Symfony2勉強会でLT発表してきました。以下が発表資料です。 発表資料:「PHPUnitのMockObjectの紹介」(slideshare版)(PDF版) 僕だけSymfony2と何の関係があるの?という感じのタイトルでしたが、案外好評だったように思います。懇親会でも何人かに声をかけて頂いて、このあたりの話題は結構ニーズがあるんだなーと感じました。 スタブとモックの違いについては伝えるのが難しいかと思っていたのですが、伝わったよ、と言ってくれた人がいて、安心しました。ちなみに文中で触れているMatrin Fowlerのブログ記事は下記です。 「Mocks Aren't Stubs」 発表中、Martin Fowlerはモックによるテストに懐疑的なようだ、という話を紹介しました。もう少し詳しく紹介すると、モックで「ふるまい」のテストを書くためには、どう実装するか

    第4回Symfony2勉強会でLT発表してきました - hnwの日記
    hiro_y
    hiro_y 2011/06/06
    「PHPUnitのMockObjectの紹介」
  • PHPの日付文字列の解釈ルールがドキュメント化されました - hnwの日記

    PHPのstrtotime関数やDateTimeクラスは、様々なフォーマットの日付文字列を解釈し、時刻として取り扱うことができます。たとえば次のような文字列を解釈することができます。 "Wednesday July 23rd, 2008"(=2008年7月23日) "first Wednesday July 23rd, 2008"(=2008年7月30日、PHP5.1.0以降) "first Wednesday of July 23rd, 2008"(=2008年7月2日、PHP5.3.0以降) こうした日付の解釈はPHP独自の実装です*1。当初はGNUの日付記法に準拠していたようですが*2、今や別物といっていいでしょう。にもかかわらず、これまで解釈ルールの詳細を説明するドキュメントが存在しない状態が続いていました。 そのため、仕様を推測する根拠はstrtotime関数のサンプルコードとP

    PHPの日付文字列の解釈ルールがドキュメント化されました - hnwの日記
    hiro_y
    hiro_y 2011/02/12
    strtotimeやDateTimeクラスで解釈できる日付文字列についてドキュメント化されたのこと
  • PHPの独特な正規表現関数:mb_ereg_search - hnwの日記

    直前の記事「mb_ereg_replace関数でe修飾子を使う際の注意点」で利用しているmb_ereg_search_ナントカという関数群は特徴的な関数ですが、あまり使用例を見ない関数です。今回はこの関数群の概要を紹介します。 この関数群は正規表現マッチを行うmb_ereg系関数のバリエーションの一つです。前回正規表現マッチした場所を覚えていて、再度呼び出すと前回のマッチングに引き続いて正規表現マッチを行います。これを使うと、次のように正規表現マッチ毎に何かの処理を行うループが作れます。 <?php mb_ereg_search_init($subject, $pattern, $option); while (mb_ereg_search()) { $matches = mb_ereg_search_getregs(); // マッチした内容ごとの処理 } Perlだとm/../gでルー

    PHPの独特な正規表現関数:mb_ereg_search - hnwの日記
    hiro_y
    hiro_y 2011/02/09
    mb_ereg_search系の関数について
  • mb_ereg_replace関数でe修飾子を使う際の注意点 - hnwの日記

    mb_ereg_replace関数でe修飾子を使ってevalする場合の注意点をまとめてみました。 概要 マニュアルの下記引用部にもあるとおり、mb_ereg_replace関数はe修飾子の指定があっても特にエスケープなどを行いません。 信頼できない入力に対しては、絶対に e 修正子を使用してはいけません。 (preg_replace() と同様、) 自動的なエスケープは行いません。このことを忘れていると、自分の書いたアプリケーションにリモートコード実行の脆弱性を作りこんでしまうことになります。 PHP: mb_ereg_replace - Manual preg_replaceでe修飾子をつけた場合、後方参照について自動でaddslashes相当のエスケープを行ってくれます(「例えばPHPのpreg_replace関数でe修飾子を避ける」参照)ので、この点において両者は挙動が異なっているわ

    mb_ereg_replace関数でe修飾子を使う際の注意点 - hnwの日記
    hiro_y
    hiro_y 2011/02/08
    mb_ereg_replace関数でe修飾子使う場合
  • PHPカンファレンス2010で発表&パネル発表してきました - hnwの日記

    9月24日、25日の両日、PHPカンファレンス2010が開催されました。僕は25日のテックデイで、PHPのストリームについて発表してきました。また、最初のPHPを作った開発者であり今もPHPのコアデベロッパーであるRasmusとHipHop for PHPの開発者Scottを招いての発表がありましたが、そのお二人を囲んでのパネルディスカッションに僕も参加しました。 「PHPストリーム概説」 PHPのストリーム機能について20分ほどプレゼンをしました。プレゼン資料は以下です。 発表資料:「PHPストリーム概説」(PDF) 元々知っていた人、初めて知った人ともにおおむね温かい反応を頂いたように思います。ありがとうございます。 実は、この内容で発表しようと思ったのはid:yandodさんとの会話がきっかけでした。yandodさんによれば、海外PHPカンファレンスではXdebugやPHPUnit

    PHPカンファレンス2010で発表&パネル発表してきました - hnwの日記
    hiro_y
    hiro_y 2010/09/26
    ストリーム/streamについて
  • 例えばPHPのpreg_replace関数でe修飾子を避ける - hnwの日記

    (2015/04/19追記)e修飾子はPHP 5.5からdeprecatedになっています。また、PHP7からは廃止されます。 PHPのpreg_replace関数では、e修飾子が利用できます。これはPerlから輸入された機能で、置換後パターンの文字列をPHP文法に従って評価する(evalする)というものです。Perlを知らないとあまり使わない機能かもしれませんが、Perlを知っているとPHPでも使いたくなるのではないでしょうか。記事では、preg_replace関数でe修飾子を使う場合の注意点を指摘し、代替案を示します。 preg_replace関数のe修飾子 preg_replace関数のe修飾子は次のような機能です。 e 修飾子を設定すると、preg_replace() は、参照先の対応する置換を行う際に replacement 引数を PHP コードであるとして取り扱います。re

    例えばPHPのpreg_replace関数でe修飾子を避ける - hnwの日記
    hiro_y
    hiro_y 2010/08/16
    preg_replace関数のe修飾子について
  • 64bit環境とPHP - hnwの日記

    先週のPHP勉強会の僕のプレゼン「64bit PHPの罠」に間違いがありました(参照:「第51回PHP勉強会@関東に参加してきました」)。全体の主張はそれほど変わりませんが、下記の通り訂正いたします。 誤:「PHPのinteger型はCのint型」「64bit環境ではPHPのinteger型は64bitになる」 正:「PHPのinteger型はCのlong型」「Unix OSの64bit環境ではPHPのinteger型は64bitになる」 補足:PHP7からは「PHPのinteger型は32bit環境ならint32_t、64bit環境ならint64_t」「64bit環境ではPHPのinteger型は必ず64bitになる」と変わりました。 PHPのinteger型はlong 次のように、PHPのinteger型は内部的に共用体_zvalue_valueのlvalというメンバになっています。

    64bit環境とPHP - hnwの日記
    hiro_y
    hiro_y 2010/05/09
    PHPと64bit環境。integer問題。