「php」タグアーカイブ

pecl::memcached はセッションの値を memcached に入れるときに圧縮しない

久しぶりに書いておいた方が良さそう(忘れそう)なのがあったので。

LANの奥の方でひっそりと動いていたPHP 5.3(pecl::memcache)なシステムをPHP 7.4(pecl::memcached)化している途中で「7.4の方だけセッションが切れる」ということがあった。

エラーメッセージはこんなのが出ていた。

PHP Warning: Unknown: error saving session to memcached: SUCCESS in Unknown on line 0, referer: ~
PHP Warning: Unknown: Failed to write session data (memcached). Please verify that the current setting of session.save_path is correct ( ~ ) in Unknown on line 0, referer: ~

最初???という感じだったんだけど、良くコードを眺めるとセッションに大きなオブジェクトを入れている箇所があり、そこでセッションの保存に失敗しているらしいことがわかった。

5.3の方は動くので実際にmemcachedに保存されている値を見るとバイナリっぽいものが保存されていて、このあたりでpecl::memcache はセッションの保存時に透過的圧縮がかかるけど、 pecl::memcached だとかからないのか?という仮説にたどり着いた。

あとは実際に拡張のコードを見ればよいのだけど、セッションの拡張のコードの追い方は
我慢強い人のためのpeclでsession_handlerを作る。を参考に PS_WRITE_FUNC を見れば良いとあたりをつけて、pecl::memcached のコードを見ると圧縮しているところはなさそうだった(ちなみに memcached_set() は libmemcached の関数)。

ということで、セッションに大きなオブジェクトを入れるのをやめるか、memcached(サーバーの方)の設定を変えるかしないとかな..

Amazon Linuxでhttpd(2.2) + PHP(5.3)の組み合わせからhttpd24 + php54へのアップデート

Apacheが2.2から2.4になって設定の書き方が多少変わっているので対応するのが面倒だったのと、普通は動作確認にしっかり時間をかけないとなやつなのでずーっと先延ばしにしていたのだけど、勢いで対応したら割とすんなりいったので(大したものを動かしていないので)メモっておきます。

とりあえずバックアップを取りましょう。

最低限は

yum erase httpd httpd-tools php php-xml php-process php-cli php-common
yum install httpd24 php54

な感じで、あとは別途インストールしているものがあればそれぞれって感じで。

newrelicの拡張がアンインストール時に削除されていまうので

yum reinstall newrelic-php5

でどうにかなります。

追記: さらにPHP 7.2にした

yum erase php54 php54-cli php54-common php54-mbstring php54-mysqlnd php54-pdo php54-pecl-apc php54-pecl-memcache php54-process php54-xml
yum install php72 php72-mbstring php72-mysqlnd php72-pdo php72-opcache php72-pecl-apcu

要注意ポイントはapcの機能がapcuとopcacheになったのと、memcacheは外したところ。

imagickを使ってpdfを画像に変換する

PHPのImagick(ImageMagick)を使ってPDFファイルを画像に変換することができます。

$imagick = new Imagick();

$imagick->readimage($pdf_file_name);

for ($i = 0; $i < $imagick->getImageScene(); $i++) {
  $imagick->setIteratorIndex($i);
  $imagick->setImageFormat('jpeg');
  $imagick->writeimage($image_file_path . '-page' . $i . '.jpg);
}

これ、結構リソース使うんですよね。ページ数の多いPDFを変換しようとしたら、memory_limitやmax_execution_timeに引っかかって…という経験ありませんか?

特定ページだけを画像化したい場合限定(1ページ目だけ変換したいとかありますよね?)ですが、次のコードでサクッとできます。

続きを読む imagickを使ってpdfを画像に変換する

PDOのプリペアドステートメントで実行するSQLを確認したい(?プレースホルダの場合)

モダンなフレームワークを使っていればこんなことで困ることもないんだろうけど、レガシーなオレオレフレームワークの面倒を見ないといけないこともあるよね。

そんな時はこんな感じでやるしかないんじゃないかな。

続きを読む PDOのプリペアドステートメントで実行するSQLを確認したい(?プレースホルダの場合)

pecl::imagickでサムネイルを作る時はstripImage()する癖をつけておいた方が無難かも

$img = new Imagick('src.jpg');
$img->thumbnailImage(80, 60);
$img->writeImage('dst.jpg');

これだとsrc.jpgはそれなりの大きさの画像だとして、80×60のサムネイルを作っているのになぜかファイルサイズが元画像とほぼ同じになってた。
(前はこれで良かったんだけど、いつからか仕様がかわった?)

$img = new Imagick('src.jpg');
$img->thumbnailImage(80, 60);
$img->stripImage();
$img->writeImage('dst.jpg');

としたらそれなりのファイルサイズになるようになった。
もしかしたら特定のバージョンのみで起こる現象なのかもしれないけど、普段からstripImage()する癖をつけておいた方が無難そう。

PEAR::Mailでのメール送信が遅い

PHP 5.3 PEAR::Mail 1.2.0 で、SMTPドライバを使って結構な数のメールを送る検証をしていたら、凄く遅くなるパターンに遭遇した。散々悩んだ挙句に見つけたのがこれ

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1176279911

ソースは読んでないけど、確かに1KB付近を境に性能が大きく変わることは確認できた(遅いパターンは3倍くらい時間がかかる)。

検証とはいえ「てすとテスト」みたいなのはやめようね。というね。。まぁでも1KB以下のメールをそれなりの数送る場合は他の方法を考えたほうが良いかもしれない。

PDOでMySQLに接続してプリペアードステートメントを使うと、クエリーキャッシュがきかないことがある

条件は

この二つの条件にあてはまる場合、プリペアードステートメントを使うとクエリーキャッシュがきかない。

続きを読む PDOでMySQLに接続してプリペアードステートメントを使うと、クエリーキャッシュがきかないことがある