1

PHP と Apache では、ヘッダーを受信した後、本体が送信される前に PHP スクリプトを開始できますか?

私はこのようなことを意味します:

PUT /sync/testStream.php HTTP/1.1
Host: localhost
User-Agent: test
Content-Length: 500
Content-Type: text/plain

<start the script here>

hello
this is a test

目的は、スクリプト中 (実際にはアップロード中) にファイルをロックすることです。

php://input から読み取ろうとしましたが、成功しませんでした。スクリプトは、本文全体が受信されたときにのみ開始されます。

これが私のスクリプトです:

<?php
echo "Hello. Start sending data.";
ob_flush();

$file = fopen('php://input', 'r');
if ($file === false) {
    die("Could not open php://input");
}

while (($line = fgets($file)) !== false) {
    echo $line;
}

echo "Bye";

どんなヒントでも大歓迎です!

4

3 に答える 3

1

私は以前にこの質問をここで見たことがあり(今は見つかりませんが、私は見ています)、多くの議論/討論の後、その結論は「いいえ、できません」でした。

これは、ファイルのアップロードプロセスとリクエストの本文の受信が、重なっているWebサーバーによって処理され、リクエストが完全に受信/解析/検証されるまでPHPが起動されないためです。

ここでの1つのポイントは、スクリプトがHTTPを介した全二重通信を確立しようとしているように見えることです。これは不可能です。HTTPは、本質的に半二重プロトコルです。要求/応答アーキテクチャを備えており、要求を完全に受信する前に応答の送信を開始することはできません。これはプロトコル違反になります。

何をしようとしているのか、アップロード中にファイルをロックする理由を正確に説明すると、別の解決策を見つけることができるかもしれません。

于 2012-04-23T09:31:22.273 に答える
0

PHPは、リクエスト全体の後に実行されます。この機能を実現するために、カスタムapacheモジュールを作成できます。

于 2012-04-23T09:31:21.367 に答える
0

実際には、HTTP リクエストが完了する前に PHP がリクエストを認識しないため、これは不可能です。つまり、アップロードが完了すると、PHP はクエリを受け取ります。

于 2012-04-23T09:31:20.257 に答える