测试现有远程文件的curl请求非常慢

时间:2015-11-10 10:06:51

标签: php curl

我今天遇到了一个问题,我找不到解决办法。

我必须对从.csv文件中获取的数据进行一些统计。

这些.csv文件的路径是动态的,取决于5个变量,所以我有一个循环来获取我需要的所有url。

最后我有大约540个网址要测试。我正在使用此功能

public static function remoteFileExists( $url )
    {

        $curl = curl_init( $url );
        curl_setopt( $curl, CURLOPT_NOBODY, true );
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        $result = curl_exec( $curl );

        $ret = false;
        if ( $result !== false ) {

            $statusCode = curl_getinfo( $curl, CURLINFO_HTTP_CODE );

            if ( $statusCode == 200 || $statusCode == 302 ) {
                $ret = true;
            }
        }

        curl_close( $curl );

        return $ret;
    }

该功能完美无缺,但目前需要40-60秒来测试我的所有网址。这花费了太多时间。

有没有人有解决方案来减少这段时间?

我已经尝试使用get_headers功能,需要相同的时间。

我也试过这个功能:

public function remote_file_exists($url){
        return(bool)preg_match('~HTTP/1\.\d\s+200\s+OK~', @current(get_headers($url)));
    }

同样的问题,需要花费太多时间。

2 个答案:

答案 0 :(得分:0)

最后我在本地进行了检查,有2个不同的站点,但它们存储在同一台服务器上。 所以我用本地电话进行检查,例如' / var /...../..../ files /.../ file.csv

我将加载时间从40-60秒减少到4秒。 目前它有效,但我在思考,如果有一天我将这个2网站放在不同的服务器上,那么什么是最好的解决方案。

答案 1 :(得分:-1)

只需设置适合您的超时时间:

public interface IYourInterface //Give it a good name
{
    void Instantiate(ServiceProvider serviceProvider, DeviceCapability deviceCapability);
}

public class YourClass : IYourInterface
{
    public YourClass() 
    {
        // do something if you want
    }

    public void Instantiate (ServiceProvider serviceProvider, DeviceCapability deviceCapability)
    {
       // what ever needs to be done here
    }
}

private void CreateManager<T>(ServiceProvider serviceProvider, DeviceCapability deviceCapability) 
    where T : IYourInterface, new()
{
    var instance = new T();
    instance.Instantiate(serviceProvider, deviceCapability);
}

/*
   Usage
*/

    CreateManager<YourClass>(serviceProvider, deviceCapability);