これは require
の標(biāo)準(zhǔn)の動(dòng)作であり、include
の動(dòng)作も同じです:
ご覧のとおり、戻り値が上書きされない場(chǎng)合、ハッピー パスでは整數(shù) (1) が返されます。
これはあなたの例では理にかなっています。これまでのところファイルは存在します(したがって致命的なエラーはありません)が、ファイルは作成されたばかりなので、単に切り捨てられているだけ、つまり空である可能性があります。 p>
したがって、戻り値は上書きされず、int(1) が表示されます。
もう 1 つの説明は、當(dāng)然、整數(shù)で上書きしたということです。複數(shù)のプロセスが同じファイルに書き込むことができるため、これも可能ですが、例を書いた方法ではその可能性は低くなります。私がこれに言及したのは、それが別の有効な説明だからです。
ファイルが存在するとき (のみ) ではなく、$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)です。
定義エラーは存在しません。
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ù)を返す可能性があることがわかっています。 、一方、配列ではありません。
スクリプトに常に 1 つのエグゼキュータしかない場(chǎng)合、この問(wèn)題は再現(xiàn)できません。
このスクリプトを並行して実行することについて話している場(chǎng)合、問(wèn)題は、排他モードでファイルを書き込んでも、後の書き込みプロセス中にファイルを読み取ることが保護(hù)されないことです。
プロセスはファイルに書き込んでいる (そしてロックを所有している) 可能性がありますが、require
はロックを尊重しません (ファイルシステムのロックは強(qiáng)制ではなく勧告です)。
したがって、正しい解決策は次のとおりです:
リーリー別のプロセスがファイルの上書きを待機(jī)している可能性があるため、書き込み後にロックは解放されず、再取得されないことに注意してください。
リリースしないのは、書かれた同じコードも require
d になるようにするためです。
しかし、このこと自體は最初から疑問(wèn)でした。
後で戻せるようにファイルに書き込む必要があるのはなぜですか? require
?