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は外したところ。

Nginx reverse proxy + Apache(mod_php)環境でmod_pagespeedを動かしてみた

出立ての頃に少し触ってすっかり忘れてたのに突然存在を思い出したので、js/css/html minifyあたりがカジュアルに使えるようになってると良いなと思いつつ。

本当はちゃんとアセットパイプラインとかやるべきなんだろうけど、そこまで手を入れられない動いているアプリケーションに次善の策として検討できると便利なんじゃないかと。

とはいえ何度も何度もminifyするのは無駄遣い感が凄いので、Apacheにmod_pagespeedを入れてminifyした結果をnginxにキャッシュさせようという戦術で、とりあえずwordpressが動いている環境にmod_pagespeedデフォルト。これはそれっぽく動いているようには見えたんだけど、JSやCSSのURLが変わってしまう(style.cssがstyle.css.pagespeed.abcd.cssのような感じに)のが嫌な感じなので元々のURLを維持しつつ、画像の最適化系まで入れるとカジュアルじゃなくなってくるので、また今度にしたい。ということで入れてみた設定が以下。
# nginx 1.1.10, apache 2.2, mod_pagespeed 1.11.33

続きを読む Nginx reverse proxy + Apache(mod_php)環境でmod_pagespeedを動かしてみた

zenbackを実験的に外してみます

いつ入れたかも正確には覚えていないという状況なんですが、確か、入れるだけで流入があるの?というのを試してみようと思ったんだったと思います。

しかも、旬な時期を外したというか、zenbackキーワーズが検索結果でオリジナルコンテンツより上に出てきちゃって困る。みたいな話が出てきて、有力なブログでzenbackを外すところが出てきはじめてから入れたんです。確か。

そんな感じですが、ある程度の期間試したので一旦まとめということで。

続きを読む zenbackを実験的に外してみます

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を画像に変換する

PubSubHubbubに対応すると、Googleが早くインデックスしてくれるかどうか実験

PubSubHubbub(パブサブハブバブ)に対応すると、「すぐにGoogleがインデックスしてくれる」と書いているブログをちょいちょいみかけるので、実際にどんなものか試してみました。

続きを読む PubSubHubbubに対応すると、Googleが早くインデックスしてくれるかどうか実験

Jetpackの拡張配信を使うと、どんな効果があるの?

Jetpackの拡張配信(Enhanced Distribution)とは、Wordpress.comを利用して運営されているブログと、Jetpackで拡張配信を有効にしているWordpress.org(自分でサーバーにインストールして使うタイプのwordpress)の投稿やコメントを、Wordpress.com firehoseというのに含めてくれる機能のようですね。

続きを読む Jetpackの拡張配信を使うと、どんな効果があるの?

appendChild()ではなくinsertBefore()を使ってスクリプトをロードするのはなぜ?

Google Analyticsのコードが使っているような、サードパーティのスクリプトを非同期にロードする方法を「createElement-insertBeforeパターン」と言うことくらいは知っていました。けど、ふと「なんでappendChildじゃ駄目なんだ?」と思って調べたのでメモ。

続きを読む appendChild()ではなくinsertBefore()を使ってスクリプトをロードするのはなぜ?

document.write()を止めるためにはFriendly iFrameを使うのが良さそう

Chromeの開発者ツールを開くとコンソールに何か出てるな。というのは気になってたんだけど、スルーしてたらこんな投稿があることを教えてもらった。
遅い通信だとChromeはdocument.writeで外部のスクリプトを読み込んでも動かなくなるらしい(A Parser-blocking, cross-origin script …)

続きを読む document.write()を止めるためにはFriendly iFrameを使うのが良さそう