为什么我的脚本需要这么长时间来检索标题?

时间:2010-11-17 14:37:33

标签: php webdav fsockopen

<?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,上传文件和断开连接。它连接并发送标头很好,但是它需要永远检索语法。有时,它需要几分钟,我不明白为什么。这是我的代码中的问题吗?

是的,我意识到那里有一个无限的循环。这是故意的,因为我还没弄明白如何知道服务器什么时候向我发送信息。所以我猜这是另一个问题,如果有人能提供这方面的见解。

由于

3 个答案:

答案 0 :(得分:3)

您的问题是因为您发送的Content-Length标头的值为220,而根本没有发送任何内容。服务器挂在那里期待内容,但它永远不会到来......

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

答案 1 :(得分:0)

您可能希望使用cURL对其进行测试。试一试:http://curl.haxx.se/mail/archive-2006-02/0000.html

这样你可以看到它是服务器端还是代码端。

答案 2 :(得分:0)

如果您连接的计算机通常处理大量流量,WebDAV可能会出现问题。尤其是大量的网络流量。原因很复杂,但我过去使用的解决方案主要涉及延迟编码。通过将一些东西倾倒在一条线上等待,或者通过将东西推到一个没有重负荷的盒子但是更直接连接到有问题的服务器并且可以通过不同的方式将文件推送到它的盒子。

然而,这一切都需要访问权限,如果您可以控制要连接的计算机,则应该能够重新配置它们以优先考虑。 (如果你连接到生产Web服务器,这可能不是一个选项)但是,我从来没有在PHP中处理这个问题。所以问题当然可能是由其他原因造成的。