2013-12-23 29 views
4

我使用Magento并从管理员回滚数据库期间得到PHP分段错误。我做了调查,看看原因是这样的:preg_replace期间PHP分段错误

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

+0

你为什么用正则表达式重整你的SQL:在方便的.htaccess格式也可以? –

+0

这不是我的代码。这是来自Magento的代码,它使用它来回滚自己的备份(SQL)。它逐个抛出语句并使用Zend Framework执行它。在我的服务器(和其他一些)上回滚不起作用,所以我试图本地化这个问题。经过调查,我明白这个问题在preg_replace。 – freento

回答

0

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

你可以尝试修改正则表达式使用较少的堆栈。

我会尝试,例如类似的东西:

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

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

他们提到这两个选择也:

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

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

OP的问题涉及到一块核心(永远不要碰触)Magento代码;更改RegEx可能会起作用,但应该是极端的最后手段。 – STW

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 

作品对我来说就像魅力。希望这可以帮助!

编辑:

php_value pcre.recursion_limit 1000 
+0

+1 - 当模块的升级脚本运行一个大的'preg_replace()'调用时,我遇到了这个问题;降低递归限制清除了段错误并让模块成功升级 – STW