ちょっとしたパズルがありますが、ないかもしれません。この作品をチェックしてください:
$query = ' SELECT account.account_no,
account.accountname,
accountbillads.bill_city,
account.website,
account.phone,
CASE
WHEN ( users.user_name NOT LIKE "" ) THEN users.user_name
ELSE groups.groupname
END AS user_name,
entity.crmid,
account.accountid,
account.parentid,
partner.partnerid
FROM account
INNER JOIN entity
ON entity.crmid = account.accountid
INNER JOIN currency_info AS CurrencyInfoTable
ON CurrencyInfoTable.id =
entity.record_currency_id
WHERE entity.deleted = 0 ';
$query = ltrim($query);
preg_match("/^select ((.|\n)*?)\bfrom\b((.|\n)*?)\bselect\b/i", $query, $matches);
print('finito');
print_r($matches);
私のサーバーでは、これはクラッシュし、どこにもエラーはありません。
驚くべきことに、トリッキーな行は $query = ltrim($query); です。 この行がなければ、すべて正常に動作します。
これにはさらにいくつかのことがあります: 正規表現の機密部分は、'select' の最後の貪欲でない検索です。2 番目の選択が見つからない場合は、クラッシュします。クエリの長さが重要です。また、同じマシンで phpunits を実行すると、この問題は発生しないことに注意してください。
私の収集は、ltrimが文字列に対して何かを行うということですが、私にはわかりません。
誰かがこれを説明できますか?
編集。よし、ltrim は問題ないようだ。最初の空白なしで文字列を指定すると、クラッシュします。pcre.backtrack_limit と pcre.recursion_limit の設定が関係しているのかもしれませんが、試してみましたが変わりませんでした。
編集2。クラッシュはブラウザで「接続が中断されました」です。完全なサーバー クラッシュは発生しませんが、スクリプトの実行は停止します。繰り返しますが、ログにエラーはありません。
問題が解決しました。最後に (.|\n) を /s に置き換える必要がありました。どうもありがとう!