1
<?php
set_time_limit(0);

$errorArr = array();
if (!isset($argv[1]))
{
    array_push($errorArr, "You forgot to enter a host.");
}
if ((isset($argv[1])) AND (!filter_var($argv[1], FILTER_VALIDATE_IP)))
{
    array_push($errorArr, "The host you entered is not a valid IP address.");
}
if (!isset($argv[2]))
{
    array_push($errorArr, "You forgot to select a port.");
}
if (!empty($errorArr))
{
    echo "You have the following errors:\n";
    print_r($errorArr);
    die("Syntax is as follows: php {$argv[0]} host port\n");
}

$host = $argv[1];
$port = $argv[2];

echo ":::Connecting...\n";
$fh = fsockopen($host, $port);
if (!$fh)
{
    die(":::Connection failed.\n:::Aborting.\n");
}
echo ":::Connected!\n:::Sending headers.\n";

$header = "PROPFIND /webdav/ HTTP/1.1\r\n";
$header .= "Host: {$host}\r\n";
$header .= "User-Agent: BitKinex/3.2.3\r\n";
$header .= "Accept: */*\r\n";
$header .= "Pragma: no-cache\r\n";
$header .= "Cache-Control: no-cache\r\n";
$header .= "Depth: 1\r\n";
$header .= "Content-Length: 220\r\n";
$header .= "Content-Type: text/xml\r\n\r\n\r\n";
if (!fwrite($fh, $header))
{
    die(":::Couldn't send headers. Aborting.\n");
}
$exHeader = explode("\r\n", $header);
foreach ($exHeader as $ecHeader)
{
    echo "<<<{$ecHeader}\n";
}
echo "\n:::Retrieving syntax...\n";
while(1)
{
    while ($data = fgets($fh, 512))
    {
        echo ">>>{$data}";
        flush();
    }
}
?>

WebDAVに接続し、ファイルをアップロードして切断するスクリプトを作成しています。接続してヘッダーを正常に送信しますが、構文を取得するには永遠に時間がかかります。時々、数分かかるのですが、その理由がわかりません。それは私のコードの問題ですか?

はい、そこには無限のwhileループがあることに気づきました。サーバーが私に情報を送信し終えたときを知る方法がわからないので、これは意図的に行われます。ですから、誰かがそれについて洞察を提供できれば、それは別の質問だと思います。

ありがとう

4

3 に答える 3

3

問題は、コンテンツをまったく送信せずにContent-Length、値が。のヘッダーを送信しているためです。220サーバーはコンテンツを期待してそこにハングアップしますが、到着することはありません...

そして、無限ループの場合は、まったく必要ありません。接続が閉じている場合はfalsefgetsを返します。データが送信された後に接続を終了するようにApacheに指示するヘッダーを送信します。データが完全に読み取られ、接続が閉じられると、whileループはfalseと評価され、ループが終了します。Connection: close

于 2010-11-17T14:54:36.893 に答える
0

接続しているマシンが一般に大量のトラフィックを処理する場合、WebDAVはCHUGを実行できます。そして特にたくさんのウェブトラフィック。理由は複雑ですが、私が過去に使用したソリューションは、主に遅延を回避するコーディングに関係していました。待機するために物を一列に並べてダンプするか、負荷が高くないが問題のサーバーに直接接続され、さまざまな方法でファイルをサーバーにプッシュできるボックスに物をプッシュすることによって。

ただし、これにはすべてアクセスが必要です。接続先のマシンを制御できる場合は、マシンを再構成して優先順位を付けることができるはずです。(これは、実稼働Webサーバーに接続している場合はオプションではない可能性があります)ただし、PHPでこれを処理する必要はありませんでした。したがって、問題は確かに他の理由によって引き起こされる可能性があります。

于 2010-11-17T15:06:46.050 に答える
0

次に、cURLを使用してテストすることをお勧めします。これを試してみてください:http://curl.haxx.se/mail/archive-2006-02/0000.html

そうすれば、サーバー側かコード側かを確認できます。

于 2010-11-17T14:57:51.447 に答える