2013-12-23 45 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