このエラーメッセージが表示されていますが、何か提案はありますか?
PHPで33554432バイトの許容メモリサイズを使い果たしました(43148176バイトを割り当てようとしました)
このエラーメッセージが表示されていますが、何か提案はありますか?
PHPで33554432バイトの許容メモリサイズを使い果たしました(43148176バイトを割り当てようとしました)
回答:
ついに私は答えを見つけました:
あなたのファイルでエラーが発生する前の行にこれを追加してください
ini_set('memory_limit', '-1');
サーバーのメモリ使用量は無制限ですが、正常に動作しています。
提案の友人を与えてくれてありがとう。
UNLIMITED
ます。
スクリプトが使用しているメモリが多すぎます。これは、制御不能になったループがあり、ループの各パスでオブジェクトを作成したり配列に追加したりしている場合、PHPでよく発生します。
無限ループをチェックします。
それが問題でない場合は、最後にオブジェクトをnullに設定して破棄することで、PHPを手助けしてください。例えば。$OldVar = null;
エラーが実際に発生しているコードも確認してください。その行が大量のメモリを割り当てていると思いますか?そうでない場合は、何が間違っているのかを試してみてください...
実行:
ini_set('memory_limit', '-1');
決して良いことではありません。非常に大きなファイルを読み取る場合は、少しずつコピーすることをお勧めします。最良の方法として、次のコードを試してください。
$path = 'path_to_file_.txt';
$file = fopen($path, 'r');
$len = 1024; // 1MB is reasonable for me. You can choose anything though, but do not make it too big
$output = fread( $file, $len );
while (!feof($file)) {
$output .= fread( $file, $len );
}
fclose($file);
echo 'Output is: ' . $output;
while
ループ:fclose($file)
残念ながら、PHPでプログラミングするのは、あなたが思っているよりも速くメモリを消費するようにプログラミングするのは簡単です。参照を使用する代わりに文字列、配列、オブジェクトをコピーすると、PHP 4よりも自動的にこれが実行されるはずですが、複数のステップでデータセット全体を処理することは、最小の論理ユニットを処理する場合よりも無駄になります。一度に。古典的な例は、データベースからの大規模な結果セットでの作業です。ほとんどのプログラマーは、結果セット全体を配列にフェッチしてから、で1回以上ループしforeach()
ます。while()
ループを使用して一度に1行をフェッチして処理する方がメモリ効率がはるかに高くなります。同じことがファイルの処理にも当てはまります。
大きなファイルを読み取る場合は、一度に読み取るのではなく、少しずつ読み取る必要があります。
簡単な計算です。1MBの大きなファイルを一度に読み取る場合、データを保持するために同時に少なくとも1 MBのメモリが必要です。
したがって、fopen
&を使用して少しずつ読み取る必要がありますfread
。
$fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);
私も同じ問題を抱えており、phpinfo.ini、php.ini、または.htaccessファイルを探しましたが、役に立ちませんでした。最後に、いくつかのphpファイルを確認し、それらを開いて、メモリ内のコードを確認しました。最後に、この解決策は私が思いついたものであり、私にとってはうまくいきました。私はワードプレスを使用していたため、このソリューションはワードプレスのメモリサイズ制限の問題に対してのみ機能する可能性があります。私の解決策は、default-constants.phpファイルを / public_html / wp-includesフォルダーのます。コードエディターでそのファイルを開き、wp_initial_constants
スコープ内のメモリ設定を見つけるか、Ctrl + Fを押して「メモリ」という単語を見つけます。そこに来るWP_MEMORY_LIMIT
とWP_MAX_MEMORY_LIMIT
。増やすだけです。私の場合は64 MBでしたが、128 MBに増やしてから、200 MBに増やしました。
// Define memory limits.
if ( ! defined( 'WP_MEMORY_LIMIT' ) ) {
if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
define( 'WP_MEMORY_LIMIT', $current_limit );
} elseif ( is_multisite() ) {
define( 'WP_MEMORY_LIMIT', '200M' );
} else {
define( 'WP_MEMORY_LIMIT', '128M' );
}
}
if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
} elseif ( -1 === $current_limit_int || $current_limit_int > 268435456 /* = 256M */ ) {
define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
} else {
define( 'WP_MAX_MEMORY_LIMIT', '256M' );
}
}
ところで、次のコードは実行しないでください。これは悪い習慣です。
ini_set('memory_limit', '-1');
wp-config.php
代わりに、これらの制限を非常に簡単に追加できます。この制限は、将来のWordPressの更新によって上書きされません。また、いくつかのセキュリティプラグイン(たとえば、WordFenceなど)は、「コア」WordPressファイルが変更された場合に問題を報告します...
wp-config.php
2行を編集して追加します(つまりdefine( 'WP_MEMORY_LIMIT', '200M' );
とdefine( 'WP_MAX_MEMORY_LIMIT', '256M' );
。「コア」WPのファイル(つまり、の下にあるすべてのものwp-includes
)とは異なり、WPのアップグレードによって上書きされwp-config.php
ません—正確にそこにありますWP定数をオーバーライドする正確な目的!
-1
短期間のプロセスには問題ありません。たとえば、単体テストまたはcomposerインストールなどの実行に使用されるphpビルダーコンテナー。このように設定した状態で運用サイトを実行しないでください。
スクリプト内のすべてのコードの上で次の行を実行することにより、phpスクリプトに許可されるメモリを増やすことができます。
ini_set('memory_limit','-1'); // enabled the full memory available.
また、スクリプトで不要な変数を割り当て解除します。
このphpライブラリを確認してください:PHPでメモリを解放する
多くの答えは、その場所にあるスクリプトに与えられるメモリの量を増やすことを試みているだけですが、多くの場合、予期しない量またはサイズのために、何かがメモリに対して自由になりすぎていることを意味します。明らかに、スクリプトの作成者でない場合は、野心的な気持ちでない限り、作成者のなすがままになります:) PHPのドキュメントでは、メモリの問題は「不十分に書かれたスクリプトが原因である」とさえ言っています」
ini_set('memory_limit', '-1');
(制限なし)はのようにサーバーを不安定にする可能性があることに注意してください0 bytes free = bad things
。代わりに、スクリプトが実行しようとしていることと、マシンで利用可能なメモリの量によって、適切なバランスを見つけます。
より良いアプローチ:スクリプトの作成者(または野心家)であれば、xdebugを使用してこのようなメモリの問題をデバッグできます。最新バージョン(2.6.0-2018年1月29日リリース)では、どの関数呼び出しが大量のメモリを消費しているかを示すメモリプロファイリングが復活しました。他の方法では見つけるのが難しいスクリプトの問題を公開します。通常、非効率性はループが受信しているボリュームを期待していないループにありますが、それぞれのケースは読者への課題として残されます:)
xdebugのドキュメントは便利ですが、それは3つの段階に沸きます:
apt-get
およびから入手可能yum
などxdebug.profiler_enable = 1
、xdebug.profiler_output_dir = /where/ever/
ファイルを読み取ろうとすると、PHPでメモリを消費します。たとえば、MP3ファイルを開いて読み取ろうとしている場合(たとえば、$ data = file( " http://mydomain.com/path/sample.mp3 ")のように、すべてをメモリにプルします。 。
ネルソンが示唆しているように、実際にこれだけのメモリを使用する必要がある場合は、最大メモリ制限を増やすように作業できます。
コマンドラインでphpを実行するのと同じ問題がありました。最近、php.iniファイルを変更し、php.iniの変更中にミスをしました
これはphp7.0用です
私が間違えたphp.iniへのパス:
/etc/php/7.0/cli/php.ini
私は設定していたmemory_limit = 256
(これは手段256 bytes
)
の代わりに、memory_limit = 256M
(どの手段256 Mega bytes
)。
; スクリプトが消費する可能性のあるメモリの最大量(128MB)
。http://php.net/memory-limit
memory_limit = 128M
修正すると、プロセスが正常に動作し始めました。
Magentoのルートディレクトリでこのコマンドを実行します php -d memory_limit=4G bin/magento