Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PHP 8.xサポート #22

Open
wants to merge 36 commits into
base: master
Choose a base branch
from
Open

PHP 8.xサポート #22

wants to merge 36 commits into from

Conversation

mikoim
Copy link

@mikoim mikoim commented Jul 6, 2020

皆様テストよろしくおねがいしま(´・ω・) スゥ-

変更

全般

PHP 8

  • 廃止された関数の置き換え
  • 廃止された構文の置き換え
  • 変数の初期化
  • ライブラリのアップデート

ImageCache2

tGrep

  • 検索サービスの切り替えを追加
  • ff5ch.syoboi.jpサポートを追加
  • find.5ch.netサポートを追加
    find.5ch.net
    検索サービスの切り替え

破壊的な変更

ImageCache2のDSN

  • MySQL: 'mysql://username:password@localhost:3306/database?charset=utf8'
  • PostgreSQL: 'pgsql://username:password@localhost:5432/database'
  • SQLite: 'sqlite:/' . $_conf['db_dir'] . '/imgcache.sqlite'

既知の問題


cherry-pick from junk2ool

  • 663f66c スマホで名前欄に置換ワードが働かないのを修正
  • ffcad34 host違いでbbsとkeyが同じスレがお気に入り登録できないのを修正
  • c041904 リファラ漏れ防止対策
  • 6d62951 2ch_ssl.subjectが効いていなかったのを修正
  • be98ce4 >>1 をあぼーんの対象外にする を追加。
  • 620d238 ip2hostを取り込み拡張パック設定で設定できるように
  • 89ed199 書き込みフォームに一時的なプロキシのオンオフ切り替えを追加
  • 72c38bd SSLでの書き込み時にRefererもhttpsにするように

@mikoim mikoim force-pushed the php8-merge branch 2 times, most recently from af8b088 to 875f7d3 Compare July 6, 2020 13:11
@mikoim mikoim marked this pull request as ready for review July 6, 2020 13:12
@mikoim mikoim marked this pull request as draft July 17, 2020 15:38
208 and others added 6 commits July 26, 2020 17:42
@mikoim mikoim marked this pull request as ready for review December 15, 2020 21:08
@mikoim
Copy link
Author

mikoim commented Dec 15, 2020

PHP 8.0.0でIt (´・ω・) works.

@pen
Copy link

pen commented Jan 9, 2021

https://github.com/pen/docker-rep2/tree/php8 を作って動かしてみました。以下のレポートはこちらのコンテナの作り方が悪い可能性も十分あります。

PDO対応

ImageCache2のDBをsqlite3にできるのはうれしいですね。これでコンテナにmysqlを入れる必要がなくなりました。

ImageCache2

ImageCahceを有効にしてスレを開くと画像リンクをスキャンしてサムネイルを作ろうとしますが、$_conf['expack.ic2.general.driver'] = "gd";ではimagejpeg()の呼び出しがエラーになりました。

[lib/handler/fastcgi.c] in request:/ic2.php?r=1&t=1&uri=http%3A%...:PHP Fatal error:  Uncaught TypeError: imagejpeg(): Argument #1 ($image) must be of type GdImage, PEAR_Error given in /var/www/lib/Thumbnailer/Gd.php:33

こちらではいったん設定値を"gd"から"imagick"にすることで問題を棚上げしました。

最近読んだスレ

「最近読んだスレ」をクリックすると

[lib/handler/fastcgi.c] in request:/subject.php?spmode=recent&no...:PHP Fatal error:  Uncaught TypeError: sizeof(): Argument #1 ($var) must be of type Countable|array, bool given in /var/www/rep2/subject.php:376

のようになり、Webサーバが500を返します。手元でsubject.php の当該箇所を

// $linesize = sizeof($lines);
$linesize = is_array($lines) ? sizeof($lines) : 0;

にしたところ、表示はされるようになりましたが、いろいろなスレを読んでも「最近読んだスレ」に登録されません。

@pen
Copy link

pen commented Jan 9, 2021

scripts下のコード

自動更新のためのスクリプトも同様のエラーが出ていました。

root# cd /var/www
root# php scripts/fetch-dat.php --mode recent 
PHP Warning:  Undefined array key "ktai" in /var/www/lib/ThreadList.php on line 44
PHP Fatal error:  Uncaught TypeError: sizeof(): Argument #1 ($var) must be of type Countable|array, bool given in /var/www/scripts/fetch-dat.php:84

@mikoim
Copy link
Author

mikoim commented Jan 10, 2021

@pen テストありがとうございま(*´・ω・) ス-

tarボールからビルドしたPHP 8.0.1では "最近読んだスレ" の問題を再現することができませんでした。
再現手順としてコマンド一式をお送りただけますでしょうか?

既知の問題

1 [IC2] PHPのビルド時にGDを有効化してもIC2から使えない

  • 再現
  • 修正
$_conf['expack.ic2.general.driver'] = "gd";

Fatal error: Uncaught Error: Call to undefined function imagecreatefromjpeg() in /var/www/lib/Thumbnailer/Gd.php:116 Stack trace: #0 /var/www/lib/Thumbnailer/Gd.php(27): Thumbnailer_Gd->_convert() #1 /var/www/lib/expack/ImageCache2/Thumbnailer.php(349): Thumbnailer_Gd->save() #2 /var/www/rep2/ic2.php(976): ImageCache2_Thumbnailer->convert() #3 /var/www/rep2/ic2.php(257): ic2_finish() #4 {main} thrown in /var/www/lib/Thumbnailer/Gd.php on line 116

2 最近読んだスレを閲覧できない・自動登録されない

  • 再現
  • 修正
Fatal error: Array and string offset access syntax with curly braces is no longer supported in /var/www/vendor/pear-pear.php.net/File_Util/File/Util.php on line 99

3 最近読んだスレのバッチ更新が出来ない

  • 再現
  • 修正 by 2

@pen
Copy link

pen commented Jan 10, 2021

すみません、まだubuntuのaptでインストールされる8.0.0で試しています。

既存のデータフォルダではうまくいくこと

まっさらではなく、運用中のデータフォルダをコピーして試したところ、先日のレポートでエラーになっていたものが正常に実行されました。

  • 「最近読んだスレ」をクリックすると一覧が表示されました
  • 新たに表示させたスレが「最近読んだスレ」一覧にも追加されました
  • scripts/fetch_dat.php が正常終了しました

既存のデータでも未使用だった機能

運用中も使用せず空だった「スレの殿堂」をクリックすると、先日と同様のエラーになりました。

[lib/handler/fastcgi.c] in request:/subject.php?spmode=palace&no...:PHP Fatal error:  Uncaught TypeError: sizeof(): Argument #1 ($var) must be of type Countable|array, bool given in /var/www/rep2/subject.php:376

スレの「No.」をクリックするとスレの詳細/管理ウィンドウがポップアップしますが、そこで「殿堂入り±」をクリック(殿堂入りへの登録)するとエラーになりました。

[lib/handler/fastcgi.c] in request:/info.php?host=asahi.5ch.net&...:PHP Fatal error:  Array and string offset access syntax with curly braces is no longer supported in /var/www/vendor/pear-pear.php.net/File_Util/File/Util.php on line 99

履歴から外す・削除する

「最近読んだスレ」の一覧からスレを開き、「No.」をクリック(ポップアップ)→ログの「履歴から外す」「削除する」のどちらも、クリックするとエラーになりました。
ただしリロードして確認すると、目的の動作(履歴からの削除やデータ削除)は行われていました。

[lib/handler/fastcgi.c] in request:/info.php?host=krsw.5ch.net&b...:PHP Fatal error:  Array and string offset access syntax with curly braces is no longer supported in /var/www/vendor/pear-pear.php.net/File_Util/File/Util.php on line 99

個人的見解

アイテムがまだ一つもないときに一覧を表示させる・最初のアイテムを追加しようとするなどの処理でエラーが出るようです。経験的に「ない」「0個」のケースでは言語の「よしなに読み替える」能力(nilは0とみなすなど)に頼ってコードが書かれていることがあり、バージョンアップでそこが厳しくなると起こりそうなことが起きている感じがします。

ネットを検索すると「php7.2以降では引数の型判定が厳しくなったため、count()で警告が出るように… 」という話が多数みつかります。レポートでエラーを起こしているsizeof()はcount()の別名であり、php8では警告ではなくFatal Errorになるのだとすると説明がつきます。

またArray and string offset access syntax with curly braces is no longer supportedなど「sizeof()の引数の型」のほかにも言語の変化に追従させたい箇所が残っているようです。

@pen
Copy link

pen commented Jan 10, 2021

初期のdataフォルダから運用した際に起こるエラーですが、以下の手順でなくなることを確認しました。

rep2/subject.phpにて:

  • 376行目を $linesize = sizeof($lines);$linesize = is_array($lines) ? sizeof($lines) : 0;に書き換える

composer実行後、vendor/pear-pear.php.net/File_Util/File/Util.phpにて:

  • $foo{3}$foo[3]のような書き換えを片っ端から行う
  • function realPathstatic function realPathに書き換える

むろんこれらは対症療法だと承知しています。問題の特定や切り分けのお役に立てば。

@mikoim
Copy link
Author

mikoim commented Jan 11, 2021

詳細なレポートありがとうございま(*´・ω・) ス
エラーは修正されま(´・ω・) スタ

@pen
Copy link

pen commented Jan 14, 2021

(また https://github.com/pen/docker-rep2/tree/php8 を使って試していますので、その問題の可能性があります)

ImageCache2でDBをsqliteにしているときブラックリスト登録がエラーになる

再現手順

準備

  • 設置直後 データはまっさらの状態
  • ImageCacheをsqliteで使う設定にする
// conf/conf_admin_ex.inc.php 104行
$_conf['expack.ic2.enabled'] = 3; // (0)

// conf/conf_ic2.inc.php 36行
$_conf['expack.ic2.general.dsn'] = 'sqlite:' . $_conf['db_dir'] . '/imgcache.sqlite';
  • サーバを起動してアクセス

  • IDとパスワード登録

  • なんでもいいから画像が貼り付けられているスレをひらく

  • 「ImageCache2/画像キャッシュ一覧」を開く (自分の環境では http://localhost:10080/iv2.php )

    • 画像が出るのを確認
  • メニューバーで「個別管理」→「変更」

  • 任意の1枚について Rank: あぼーん へ

  • 画面下の「変更」

    • あぼーんした画像は一覧から消える(正常)

ブラックリストへの登録

  • 別の1枚について「削除する」をチェック→「ブラックリストに登録する」をチェック
  • 画面下の「変更」
    • エラー
[lib/handler/fastcgi.c] in request:/iv2.php:PHP Fatal error:  Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: ic2_blacklist.size in /var/www/vendor/roojs/pdo_dataobject/PDO/DataObject.php:3190
Stack trace:
#0 /var/www/vendor/roojs/pdo_dataobject/PDO/DataObject.php(3190): PDOStatement->execute()
#1 /var/www/vendor/roojs/pdo_dataobject/PDO/DataObject.php(2525): PDO_DataObject->query('INSERT INTO "ic...')
#2 /var/www/lib/expack/ImageCache2/DatabaseManager.php(150): PDO_DataObject->insert()
#3 /var/www/rep2/iv2.php(543): ImageCache2_DatabaseManager::remove(Array, true)
#4 {main}

Next PDO_DataObject_Exception_Query: Could not run Query: SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: ic2_blacklist.size in /var/www/vendor/roojs/pdo_dataobject/PDO/DataObject/Exception.php:45
Stack trace:
#0 /var/www/vendor/roojs/pdo_dataobject/PDO/DataObject.php(5844): PDO_DataObject_Exception::factory('Could not run Q...', 'Query', Object(PDOException))
#1 /var/www/vendor/roojs/pdo_dataobject/PDO/DataObject.php(3222): PDO_DataObject->raise('Could not run Q...', 'Query', Object(PDOException))
#2 /var/www/vendor/roojs/pdo_dataobject/PDO/DataObject.php(2525): PDO_DataObject->query('INSERT INTO "ic...')
#3 /var/www/lib/expack/ImageCache2/DatabaseManager.php(150): PDO_DataObject->insert()
#4 /var/www/rep2/iv2.php(543): ImageCache2_DatabaseManager::remove(Array, true)
#5 {main}
  thrown in /var/www/vendor/roojs/pdo_dataobject/PDO/DataObject/Exception.php on line 45

データベース管理/ランク:0の画像を消去

  • p2のもとのメニューから「ImageCache2/データベース管理」を開く ( http://localhost:10080/ic2_manager.php )
  • ランク:0の画像を削除する(→実行→OK)
    • 終了するが何も起こらない
    • ログにも何もでない
    • チェックボックスに無関係

データベース管理/ブラックリスト登録

  • おなじく「ImageCache2/データベース管理」画面
  • あぼーん画像を削除し、ブラックリストに登録する
    • エラー
0^H[lib/handler/fastcgi.c] in request:/ic2_manager.php:PHP Fatal error:  Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: ic2_blacklist.size in /var/www/vendor/roojs/pdo_dataobject/PDO/DataObject.php:3190
Stack trace:
#0 /var/www/vendor/roojs/pdo_dataobject/PDO/DataObject.php(3190): PDOStatement->execute()
#1 /var/www/vendor/roojs/pdo_dataobject/PDO/DataObject.php(2525): PDO_DataObject->query('INSERT INTO "ic...')
#2 /var/www/lib/expack/ImageCache2/DatabaseManager.php(150): PDO_DataObject->insert()
#3 /var/www/rep2/ic2_manager.php(96): ImageCache2_DatabaseManager::remove(Array, true)
#4 {main}

Next PDO_DataObject_Exception_Query: Could not run Query: SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: ic2_blacklist.size in /var/www/vendor/roojs/pdo_dataobject/PDO/DataObject/Exception.php:45
Stack trace:
#0 /var/www/vendor/roojs/pdo_dataobject/PDO/DataObject.php(5844): PDO_DataObject_Exception::factory('Could not run Q...', 'Query', Object(PDOException))
#1 /var/www/vendor/roojs/pdo_dataobject/PDO/DataObject.php(3222): PDO_DataObject->raise('Could not run Q...', 'Query', Object(PDOException))
#2 /var/www/vendor/roojs/pdo_dataobject/PDO/DataObject.php(2525): PDO_DataObject->query('INSERT INTO "ic...')
#3 /var/www/lib/expack/ImageCache2/DatabaseManager.php(150): PDO_DataObject->insert()
#4 /var/www/rep2/ic2_manager.php(96): ImageCache2_DatabaseManager::remove(Array, true)
#5 {main}
  thrown in /var/www/vendor/roojs/pdo_dataobject/PDO/DataObject/Exception.php on line 45

172.17.0.1 - - [14/Jan/2021:15:09:41 +0000] "POST /ic2_manager.php HTTP/1.1" 500 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"

データの状態

NOT NULL constraint failed: ic2_blacklist.size とのことだがsizeがNULLのレコードはない

$ sqlite3 p2data/data/db/imgcache.sqlite

sqlite> SELECT id, size FROM imgcache;
id  size
--  -------
3   216054
8   254943
5   262656
6   264088
7   264299
11  391681
10  446448
4   622179
1   773021
9   1221966
Run Time: real 0.000 user 0.000155 sys 0.000141

その他のメニュー

  • 正常: PC用以外の作成済みサムネイルを消去する
  • 正常: 一覧表示用のデータキャッシュを消去する
  • 正常: エラーログを消去する [エラーログを見る]
  • 不明: ブラックリストを消去する [ブラックリストを見る] (登録できないので空の状態しかみえない)
  • 不明: データベースを最適化する (何をしているのか知らない)

ほかのデータベースでは起こるのか

これが肝心なんですが、試していません。すみません。
元open774版でmysqlに接続していますがこちらではエラーにはなりませんでした。

@mikoim
Copy link
Author

mikoim commented Jan 14, 2021

@pen 修正しま(´・ω・) スタ

@pen
Copy link

pen commented Jan 14, 2021

データベース管理/ランク:0の画像を消去 が動かない

何もせずに終了し、何もログに出しません。期間指定をしても同じです。

この機能、画像キャッシュ一覧でランクの操作を一切しないまま実行したときはすべての画像が消えるはず、という理解でいいですよね。

ImageCache2でmysqlに接続するdsnがわからない

mysqldを立てて conf/conf_ic2.inc.php の dsn を変更して接続しようとしたのですが

# php scripts/ic2.php setup
#
enabled=3
dsn='mysql:unix_socket=/run/mysqld/mysqld.sock;dbname=ic2'
driver='gd'
Image Driver: OK

In Exception.php line 45:

  Invalid syntax of DSN : mysql:unix_socket=/run/mysqld/mysqld.sock;dbname=ic2
  Array
  (
      [scheme] => mysql
      [path] => unix_socket=/run/mysqld/mysqld.sock;dbname=ic2
  )


setup [--check-only] [--pg-trgm PG-TRGM]

PDO_MYSQLのdsnってどう書けばよいのでしょうか。

mysql:localhost:dbname=ic2
mysql:host=127.0.0.1;port=3306;dbname=ic2

などを試しましたが、どれも同じエラーになりました。

ちなみに現在のopen774版だとdsnは

mysqli://root@unix(/run/mysqld/mysqld.sock)/ic2 

でうまくいっています。
エラーにschemeとかpathとか出ているので、文法チェックだけmysqli式のままなんじゃないでしょうか。

@mikoim
Copy link
Author

mikoim commented Jan 15, 2021

画像削除

修正しま(´・ω・) スタ

DSN

残念ながら使用しているORMがUNIX domain socketに対応していないようです
https://github.com/roojs/PDO_DataObject/blob/c08d88f4f6264591e6908d55d8261da7cfa95a5c/PDO/DataObject.php#L582-L591
https://roojs.github.io/PDO_DataObject/docs/index.html#config
Pull requests are welcome

@pen
Copy link

pen commented Jan 15, 2021

画像削除

期待する動作を確認しました。

DSN mysqlソケット

いけました。

dsn='mysql://root@localhost/imgcache?charset=utf8;unix_socket=/run/mysqld/mysqld.sock'

https://github.com/roojs/PDO_DataObject/blob/c08d88f4f6264591e6908d55d8261da7cfa95a5c/PDO/DataObject.php#L594-L596

@mikoim
Copy link
Author

mikoim commented Jan 15, 2021

お勉強させていただきま(*´・ω・) スタ
サンプルに追加しておきま(´・ω・) ス

mysql_real_connect()

If host is NULL or the string "localhost", a connection to the local host is assumed:
On Unix, the client connects using a Unix socket file. The unix_socket argument or the MYSQL_UNIX_PORT environment variable may be used to specify the socket name.

If unix_socket is not NULL, the string specifies the socket or named pipe to use. Note that the host argument determines the type of the connection.

https://dev.mysql.com/doc/c-api/8.0/en/mysql-real-connect.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

IC2をMDB2へ移行
3 participants