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,而根本不发送任何内容。服务器挂在那里期待内容,但它永远不会到达......

对于你的无限循环,你根本不需要它。如果连接已关闭,fgets将返回false 。发送Connection: close标头告诉 Apache 在数据发送后结束连接。当完全读取数据并且连接已关闭时,您的 while 循环将评估为false ,并且您的循环将退出。

于 2010-11-17T14:54:36.893 回答
0

如果您连接的机器通常处理大量流量,WebDAV 可以 CHUG。尤其是大量的网络流量。原因很复杂,但我过去使用的解决方案主要涉及围绕延迟进行编码。通过将内容转储到队列中等待,或者将内容推送到负载不重但更直接连接到相关服务器并可以通过不同方式将文件推送到该服务器的盒子。

然而,这一切都需要访问,如果您可以控制要连接的机器,您应该能够重新配置它们以赋予自己优先级。(如果您连接到生产网络服务器,这可能不是一个选项)但是,我从来没有在 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 回答