2016年12月

php7とphp5のlist関数の挙動の違いについて

ErogameScapeでは以下のようにPostgrelSQLのdate型の列から取り出した日付を年月日に分解するスクリプトがあります。
$ php -r 'list($year,$month,$day) = sscanf("2016-02-23","%d-%d-%d"); var_dump($year);'
Command line code:1:
int(2016)
上記をタイポして以下のように記述しているところがありました。
list($year,$month,$year) = sscanf("2016-02-23","%d-%d-%d");
PHP5までは問題なく…動いていました。
$ php -r 'list($year,$month,$year) = sscanf("2016-02-23","%d-%d-%d"); var_dump($year);'
Command line code:1:
int(2016)
しかし、PHP7で挙動がかわって以下のように日付が抽出されるようになりました。
$ php -r 'list($year,$month,$year) = sscanf("2016-02-23","%d-%d-%d"); var_dump($year);'
Command line code:1:
int(23)
タイポを直して解決しました。

Fatal error: Allowed memory size of 402653184 bytes exhausted (tried to allocate 4294964625 bytes)

phpを5.6.27から5.6.28にあげた際に以下のerrorが発生しました。

Fatal error: Allowed memory size of 402653184 bytes exhausted (tried to allocate 4294964625 bytes) in /home/ap2/public_html/ero/toukei_kaiseki/index.php on line 20

line 20には
session_start();
と書いてあります。

コマンドラインから実行しても以下のとおりでした。

$ php -r "session_start();"
PHP Fatal error:  Allowed memory size of 402653184 bytes exhausted (tried to allocate 4294965058 bytes) in Command line code on line 1

Fatal error: Allowed memory size of 402653184 bytes exhausted (tried to allocate 4294965058 bytes) in Command line code on line 1

環境は以下のとおりです。

CentOS 6
php56w-5.6.28
php56w-pecl-memcache-3.0.8-2

結論から書くと、php56w-pecl-memcache-3.0.8をやめてphp56w-pecl-memcached-2.2.0にしました。


session.save_handler をmemcachedからfileにするとerrorが消えたので、memcached周りの問題だと思いました。
phpを5.6.27に戻すとerrorが消えるので5.2.28の問題かと思いました。

verを元に戻すには、以下のとおりyum downgradeコマンドを使いました。
依存しているパッケージをすべて選択しています。
# yum downgrade php56w php56w-common php56w-cli php56w-snmp php56w-process php56w-xmlrpc php56w-pdo php56w-soap php56w-opcache php56w-ldap php56w-devel php56w-xml php56w-mbstring php56w-gd php56w-pgsql

標題の文句でググると以下のBug報告がひっかかりました。
https://bugs.php.net/bug.php?id=73497
https://bugs.php.net/bug.php?id=73539

パッチをあてるか、
memcacheの3.0.8のリリースを待たないといけないようでしたので、同じ機能を持つ
memcachedに乗り換えることにいたしました。

https://bugs.php.net/bug.php?id=73497によるとThis bug can also be reproduced with php 7.0.13 and memcache 3.0.9-devとのことです。
記事検索