我有一个谜题要问你,也许没有。检查这块:
$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); 没有这条线,一切正常。
这还有几件事:正则表达式的敏感部分是对“选择”的最后不贪婪搜索。如果找不到第二个选择,则崩溃。查询的长度很重要。另外,请注意,在同一台机器上运行 phpunits 时,不存在此问题。
我的聚会是ltrim对字符串做了一些事情,但我不确定是什么。
有人可以解释一下吗?
编辑。好吧,看来 ltrim 不是问题。如果我只给出没有起始空白的字符串,我就会崩溃。它可能与 pcre.backtrack_limit 和 pcre.recursion_limit 设置有关,但我已经尝试过了,但没有改变。
编辑2。崩溃是浏览器中的“连接中断”。没有完整的服务器崩溃,但脚本执行停止。同样,日志中没有错误。
问题解决了。最后我不得不用 /s 替换 (.|\n) 。非常感谢你们!