国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

PHP で不可能な場(chǎng)合、require メソッドは int を返します
P粉883223328
P粉883223328 2023-09-02 09:55:14
0
2
694
<p>いくつかの PHP コードをファイルに保存し、それをロードして再度実行する次のコードがありますが、require メソッドが int を返す場(chǎng)合があります。これはなぜ発生しますか? </p> <h1>demo.php</h1> <pre class="brush:php;toolbar:false;"><?php $f = function() use($a){ $cachePath = '/tmp/t.php'; $code = '<?php'; $code .= "\n\n"; $code .= 'return ' . var_export([], true) . ';'; file_put_contents($cachePath, $code, LOCK_EX); if (file_exists($cachePath)) { // 次の行は int を返すことがありますが、なぜですか? $result = require($cachePath); if (!is_array($result)) { var_dump($result, $cachePath, file_get_contents($cachePath)); exit("ok"); } var_dump($result); } }; for($i=0;$i<1000000;$i ) { $f(); }</pre> <h1>再現(xiàn)方法は? </h1> <p>2 つの PHP プロセスを使用して上記のコードを?qū)g行します</p> <pre class="brush:php;toolbar:false;">phpdemo.php</pre></p>
P粉883223328
P粉883223328

全員に返信(2)
P粉351138462

これは require の標(biāo)準(zhǔn)の動(dòng)作であり、include の動(dòng)作も同じです:

ご覧のとおり、戻り値が上書きされない場(chǎng)合、ハッピー パスでは整數(shù) (1) が返されます。

これはあなたの例では理にかなっています。これまでのところファイルは存在します(したがって致命的なエラーはありません)が、ファイルは作成されたばかりなので、単に切り捨てられているだけ、つまり空である可能性があります。 p>

したがって、戻り値は上書きされず、int(1) が表示されます。

もう 1 つの説明は、當(dāng)然、整數(shù)で上書きしたということです。複數(shù)のプロセスが同じファイルに書き込むことができるため、これも可能ですが、例を書いた方法ではその可能性は低くなります。私がこれに言及したのは、それが別の有効な説明だからです。

存在する場(chǎng)合は含む

ファイルが存在するとき (のみ) ではなく、$result を検索するときに競(jìng)合狀態(tài)を一時(shí)停止する方法の例:

リーリー

その背後にある考え方は、ファイルが存在するかどうかのチェックなどのエラー処理をほとんど行わず、そうでない場(chǎng)合はインクルードできない(include() は警告を発し、それを $result = false で渡すだけ)、そしてその後に行うというものです。 if $result ロードは is_array() テストで機(jī)能します。

これはエラーに関するものですが、何を探しているのかはわかっています。つまり、$result は配列です。

これは、トランザクションまたはトランザクション操作と呼ばれることがよくあります。

この新しい例では、$result 配列が空の場(chǎng)合、つまりデータが含まれていない場(chǎng)合には、if-body も入力しません。

プログラム処理レベルでは、これは私たちにとって興味深いかもしれません。ファイルの有無(wú)、空であるか空ではない、さらには間違って書き込まれていることさえも、すべて「食べて」$result を無(wú)効にする必要があるエラー狀態(tài)です。

定義エラーは存在しません。

解析エラーの処理 (Include-If-Exists の場(chǎng)合)

PHP 7.0 以降、include() を使用できるようになりました。殘念ながら、返されたインクルード ファイルが半分しか書かれていない場(chǎng)合は、PHP 解析エラーが表示され、これを捕捉できます : リーリー

例外をスローする方法/例外処理作業(yè)の詳細(xì)については、

PHP try-catch-finally を參照してください。この例では、assert() を使用して入力パラメータ $cachePath の意味を記録しています。

2 番目の例では、抑制操作「@」を使用していません。その理由は、これが前の例のように使用され、インクルードされるファイルに実際の致命的なエラーが含まれる場(chǎng)合、致命的なエラーが沈黙するためです?,F(xiàn)在、最新の PHP では、これは大きな問(wèn)題ではありませんが、file_exists() include() の使用は、チェック時(shí)間と使用時(shí)間の関係で競(jìng)合狀態(tài)が発生しますが、安全であり (警告のみ)、非プロシージャにとっては致命的です。存在するファイルのエラーは非表示になりません。

ご覧のとおり、詳細(xì)を知れば知るほど、可能な限り將來(lái)性のあるコードを書くのが難しくなります。エラー処理自體に惑わされず、結(jié)果に焦點(diǎn)を當(dāng)て、これらのエラーが存在しないことを定義する必要があります。

そうは言っても、 include() は依然としてデータをメモリにロードさせます。 file_exists() は警告を「抑制」するためにのみ使用されます。それにもかかわらず、 include() は警告を発行し、整數(shù)を返す可能性があることがわかっています。 、一方、配列ではありません。


さて、プログラミングは難しいので、たとえば、ループでラップして 3 回再試行するとします。

for ループを使用して再試行回?cái)?shù)をカウントして保護(hù)してみてはいかがでしょうか?

P粉550323338

スクリプトに常に 1 つのエグゼキュータしかない場(chǎng)合、この問(wèn)題は再現(xiàn)できません。

このスクリプトを並行して実行することについて話している場(chǎng)合、問(wèn)題は、排他モードでファイルを書き込んでも、後の書き込みプロセス中にファイルを読み取ることが保護(hù)されないことです。

プロセスはファイルに書き込んでいる (そしてロックを所有している) 可能性がありますが、require はロックを尊重しません (ファイルシステムのロックは強(qiáng)制ではなく勧告です)。

したがって、正しい解決策は次のとおりです:

リーリー

別のプロセスがファイルの上書きを待機(jī)している可能性があるため、書き込み後にロックは解放されず、再取得されないことに注意してください。

リリースしないのは、書かれた同じコードも required になるようにするためです。

しかし、このこと自體は最初から疑問(wèn)でした。

後で戻せるようにファイルに書き込む必要があるのはなぜですか? require?

最新のダウンロード
詳細(xì)>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート