preg_replace期间的PHP分段错误

时间:2013-12-23 20:32:46

标签: php magento zend-framework crash

我正在使用Magento并在管理员回滚数据库中遇到PHP Segmentation故障。我制作和调查,看到原因是这样的:

preg_replace("/'(\\'|\\\\{2}|[^'])*'/", '', $sql);

$ sql字符串足够大,我正在附加它。

https://drive.google.com/file/d/0B9UbKYbywcABOTRSVG5KRl9La0k/edit?usp=sharing

您可以使用此类脚本重现问题:

<?php
    $test = file_get_contents('test.txt');
    $sql = preg_replace("/'(\\'|\\\\{2}|[^'])*'/", '', $test);

可能有人知道这个问题,可以帮我解决吗?

P.S。直接导致问题的类是抽象类Zend_Db_Statement 204:208

2 个答案:

答案 0 :(得分:4)

我一直在努力解决这个问题,偶然发现了这个建议更改php.ini值的线程:

http://zend-framework-community.634137.n4.nabble.com/Fixing-Zend-Db-Statement-stripQuoted-seg-faults-on-large-SQL-strings-in-ZF-1-x-td4648143.html

[PCRE]
pcre.recursion_limit = 1000

对我来说就像一个魅力。希望这有帮助!

编辑:也可以方便的.htaccess格式提供:

php_value pcre.recursion_limit 1000

答案 1 :(得分:0)

基于这篇文章:http://man.he.net/man3/pcrestack

您可以尝试修改regexp以使用更少的堆栈。

我会尝试类似的例子:

preg_replace("/'([^']+|\\'|\\\\{2})*'/", '', $sql);

或者在这里:https://bugs.php.net/bug.php?id=61579

他们也提到了这两种选择:

"/'(\\\\'|\\\\{2}|[^']+)*'/"

"/'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'/"