ホームページ  >  記事  >  バックエンド開発  >  ThinkPhp3.2 を Linux 環境に配置すると、プログラム メモリ割り当ての問題が発生する

ThinkPhp3.2 を Linux 環境に配置すると、プログラム メモリ割り当ての問題が発生する

WBOY
WBOYオリジナル
2016-06-23 13:39:311227ブラウズ

エラーメッセージ:
--------------------------------------------- -------
: (
許容メモリ サイズ 1916796928 バイトが使い果たされました (3086655745 バイトを割り当てようとしました)
ファイル:/Data/XXX/Common/Function s.php 行: 370
Thinkphp3.2.2 { 高速かつシンプルOOP PHP フレームワーク } -- [ 考えるだけでできる ]

---------------------------------- --------------------
環境はphp5.4+nginx+mysql、マシンはAlibaba Cloudホスト、メモリは1024mです
そのようなことに遭遇した人はいますか?問題は何ですか?
どうすれば解決できますか? www.conf のmemory_limit を変更した後もこの問題が発生します

一度に 2.8G が必要ですか?行は次のようなものです:

        return ucfirst(preg_replace_callback('/_([a-zA-Z])/', function($match){return strtoupper($match[1]);}, $name));
実際に 2.8G メモリを割り当てたいですか?

許容メモリ サイズ 1916796928 バイトが使い果たされました (3086655745 バイトを割り当てようとしました)

の意味:

191679692 8b (1828M) の使用可能なメモリ

3 を申請します086655745b ( 2943M) スペースに失敗しました


処理される変数 $name に明らかに問題があります

Runtime ディレクトリをクリアして、再試行してください


Runtime ディレクトリをクリアしても、問題はまだ解決されていません

2 日経ちましたが、問題はまだ解決されていません! 解決策...

フレームワークがメモリを消費します。
フレームワークがどれだけのメモリを消費しても、おそらく無限ループになり、スペースが空き続けます。問題、書かないでください
$b = preg_replace_callback('/_([a-zA-Z])/', 'aaa', $name)

return ucfirst($b);

function aaa($match){

Return strtoupper($match[1]);

}

_([a-zA-Z]) を置き換えて最初から検索するため、無限ループになる可能性があります終了させる必要があります。

たとえば、停止するには _ を削除します

おそらく、別の解決策を使用できます: preg_replace、preg_match_all、preg_split


まあ、フレームワークがどれだけのメモリを消費しても、2G を消費することはできません
おそらく無限ループで常にスペースが開かれます。
問題がその文にあると確信している場合は、それほど複雑に書かないでください
$b = preg_replace_callback('/_([a-zA-Z])/', 'aaa', $name)
return ucfirst($ b);

function aaa($match){
return strtoupper($match[1]);

_([a-zA-Z]) を置き換えて最初から開始するためかもしれません、つまり無限ループになるので、何らかの方法で終了させる必要があります。

たとえば、停止するには _ を削除します

別の解決策としては、preg_replace、preg_match_all、preg_split が考えられます



----------- ---------- --------------------
これはフレームワーク内のコードです。私が書いたものではありません。

リフレッシュ後、再度以下の問題が発生しました。再度リフレッシュしても上記のメモリ問題が交互に発生します。
------------------
502 Bad Gateway

nginx/1.4.1

プログラムの書き方が間違っている可能性があります。間違っているため、基礎となるフレームワークが無限ループを作成します。
これを実行すると、制御できる論理フローがわかります。

先頭から始めて、文ごとに exit(); を追加します (もちろん、二分法を使用して見つけることもできます)
どの文が開かれるまでこの問題が発生するか、その文は間違っています。
その文でどのような関数が使用されているかを確認し、変数を出力し、パラメータを渡す順序が正しいかどうかを確認します。
うまくいかない場合は、その文と近くのコードを投稿して、みんなが見てみるのを手伝ってください

3.0 を見てみましたが、あなたが言及したような機能はないようです
http://doc.thinkphp. cn/reference/functions.html
バージョンが古い可能性がありますか?

ああ、3.2.2 を読み間違えました。9 階を押して実行してください。

では、使用方法を公式マニュアルと一致させてください。

http://document.thinkphp.cn/manual_3_2.html


一度に 2.8G 必要ですか?

--------- ----- ----------------

モデレータさん、あなたも同じ質問に遭遇して答えたことはありませんか?あなたは毎日2時まで起きていて、一目見ただけですべてを忘れる能力を持っていますか?

問題の原因は、preg_replace_callback にメモリ リークがあることです。 Windows では問題ありませんが、Linux 5.4.22 では突然上記の問題が発生します。

問題は、Linux で php5.4 を使用すると、TP32 で上記の問題が発生する可能性があることです。

我的php环境是 5.4.22.

很奇怪!即便我判定是 bug,那也不能说明什么




什么东西一次要2.8G?


----------------------------
版主,你不是碰到和回答过同样问题么?你是不是天天熬夜到2点,达到了过目就忘的能力啊。
问题原因就在于:preg_replace_callback出现内存泄露。在windows下没有问题,在linux下5.4.22,一下有上面问题。

所在,TP32在linux用php5.4可能会出现上面问题。

我怀疑是你的程序哪里错了,可能是写法错了,使底层框架产生死循环。
你这样做,查看你可控的逻辑流程。
从上面开始,一句句往下添加exit();(当然你可以用二分法找)
直到开启哪一句使得出现这个问题,就是那句错了。
查一下那句用到了什么函数,打印一下变量,看看传参顺序有没有错。
不行的话把那句及附近的代码贴上来让大家帮你看看



多谢,和我程序完全没有关系。随便使用下 preg_replace_callback就会出现问题。比如test.php:
var_dump(preg_replace_callback('/\w{2}/',function($m)use(&$i){ echo ' i='.$i++; return $m[0]."cc ";},'abcd2acc'));

也会出现同样的问题。在国外网站随便一搜索,报告这个bug的人实在是太多了。但一直反复解决了,又反复出现。

自己写了个自认为比TP优秀多的框架YuYan PHP,从根本上解决了此问题。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。