【问题标题】:PHP Segmentation fault during preg_replacepreg_replace 期间的 PHP 分段错误
【发布时间】:2013-12-23 20:32:46
【问题描述】:

我正在使用 Magento 并在从管理员回滚数据库期间遇到 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);

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

附:直接导致问题的类是抽象类 Zend_Db_Statement 204:208

【问题讨论】:

  • 你为什么要用正则表达式来破坏你的 SQL?
  • 这不是我的代码。这是来自 Magento 的代码,它使用它来回滚自己的备份 (SQL)。它会一一抛出语句并使用 Zend Framework 执行它。在我的服务器(和其他一些服务器)上,回滚不起作用,所以我试图定位问题。经过调查,我了解到问题出在 preg_replace 中。

标签: php magento zend-framework crash


【解决方案1】:

我自己一直在努力解决这个问题,偶然发现了这个建议更改 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 - 当模块的升级脚本运行大的preg_replace() 调用时,我遇到了这个问题;降低递归限制清除segfault,让模块升级成功
【解决方案2】:

根据这篇文章:http://man.he.net/man3/pcrestack

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

我会尝试类似的方法,例如:

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

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

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

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

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

【讨论】:

  • OP 的问题与一段核心(永远、永远、永远不要接触)Magento 代码有关;更改正则表达式可能会起作用,但应该是最后的最后手段。
猜你喜欢
  • 2010-12-10
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多