【问题标题】:cURL retrieving CSV filecURL 检索 CSV 文件
【发布时间】:2013-03-08 07:18:29
【问题描述】:

我的托管公司必须更改他们的服务器或其他东西,我已经让这段代码完美地运行了 8 到 10 年..YEARS!.. 今天它停止了。我想知道今天使用 cURL 是否与我 8 到 10 年前写这篇文章时发生了很大变化……请帮忙。它抓取 csv 并持续很长时间来获取文件.. 我在 20 分钟后退出浏览器.. 应该并且过去只需要 25 秒。下面的第一行也是一个问题.. 不知何故,在任何其他服务器上它显示正确的 3 个月回溯日期.. 在我的服务器上,我的网站托管在.. 它显示 1969.. 所以起初我假设日期试图获取数据从 1969 年开始是滞后/滞留。但是当我将其修复为新代码时,它仍然滞后。

//$newdates = date("Ymd",strtotime(date('Ymj')) - (60 * 24 * 60 * 60));
// the above for some reason doesnt work anymore gives the 1969 date.. so below fixed

$newdates = date("Ymd", strtotime("-3 months")); 
$tm = "http://123.theserver.net/data/sel_data=*&query_str=lud>'$newdates'&dl_type=file&send_done=no&e=.csv"; 
$ch = curl_init($tm);  
$fp = fopen("/home/sites/www.mydomain.com/mx/data.csv", 'w'); 
curl_setopt($ch, CURLOPT_FILE, $fp);  
curl_setopt($ch, CURLOPT_HEADER, 0);  
curl_exec($ch); 
curl_close($ch); 
fclose($fp);   

有点沮丧,因为托管公司说他们没有改变任何东西......而且有 2000 英里之外,所以我在这里缺少更新的代码吗?

非常感谢!!

【问题讨论】:

  • Curl 是否仍然启用? var_dump(curl_version());

标签: php curl csv file-transfer


【解决方案1】:

试试:

$newdates = date("Ymd", strtotime("-3 months"));    
$url_init = "http://123.theserver.net/data/sel_data=*&query_str=lud>'$newdates'&dl_type=file&send_done=no&e=.csv";

$ch = curl_init($url_init);

    if (!$ch) die ("Curl not loaded");

$fp = fopen("/home/sites/www.mydomain.com/mx/data.csv", 'w'); 

curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL, $fp);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

if( ! $tmp = curl_exec($ch))
{
   echo curl_error($ch);
} 

else
{

header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=$start.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo $tmp;
}
curl_close($ch);

【讨论】:

  • 这意味着 curl 抓取一个 XML 文件或者它被解析为 XML,执行 var_dump($tmp); 来抓取一个数据。
  • 地址:curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  • Put var_dump($tmp); 查看数据,您的数据已解析但基于 XML,因为您获得了“Resource id #3”,这意味着您将 XML 数据作为对象接收。因此,您需要将数据解析为 XML $tmp->data["some_info"]["array"][....]; 我不知道您的结果到底如何,因为您没有从 CURL() 的结果中转储数据;在var_dump($tmp).
  • 你知道,你确定吗?尝试转储数据。
  • 它只是带有 , 的数据,所以写入 csv 文件是滞后的。好的,它可以正常工作,它只是超时.. 1/4 的文件被输入.. 那是我的服务器吗? (萨米奇去找点事做)如果我把代码中的链接放在那里,把 20121201 放进我的浏览器,然后点击发送,我会弹出一个窗口来下载文件 .. 以 csv 格式.. 这需要 3 秒获得。所以这实际上是我的托管吧?!?
【解决方案2】:
  1. 检查 URL 的格式是否正确。
  2. 确保远程服务器不是永远占用的服务器。
  3. 检查服务器上的平均负载。由于严重的 IO 瓶颈,写入速度可能非常慢。

另外,永远不要对你的主人说“我的代码在 X 年前运行良好,现在它坏了,所以这是 你的错”,因为那是我们停止放屁的确切时刻。在这种特定案例中,您的代码可能不是问题,但是很多人都向我们提出这个借口,事实是 sh*t 代码可以工作多年,直到它达到其效率图的渐近线而且有很多级别的不关心...他们的工作是确保服务器正常工作,他们不会为您调试代码而获得报酬。

应该做的是尽你最大的能力调查问题,包括你的发现和支持票证中的支持证据,并且从不暗示服务器操作“必须改变某事”。

【讨论】:

  • 作者说Resource id #3 表示接收到 XML 数据,应该将数据从对象解析为数组并获取数据...
  • @CraigR 等等,什么?那曾经是如何工作的呢? date('Ymj') 返回一个 string [2013037 for today] 从中减去 60 天(以秒为单位)5184000,当前为 -3170963,这是一个无效的时间戳,因此默认为 1970 年 1 月 1 日 00:00:00 GMT用来。我收回我所说的关于你的代码没问题的说法。
  • 代码被注释了,所以这是他的错误...echo $newdates = date("Ymd", strtotime("-3 months"));结果:20121208
  • 把它放在一个文件中..它应该是 20121208 ......它在其他 5 家托管公司的服务器上运行..但在主题服务器上它返回 1969。回显打印它。告诉我你的服务器说什么。它还可以帮助您准确地了解这个托管公司的服务器的问题是什么(正如他们所说,他们从未改变过任何东西......但我在 8-10 年内从未改变过我的脚本)。 $newdates = date("Ymd",strtotime(date('Ymj')) - (60 * 24 * 60 * 60));
  • 道德是......如果他们说是,我们确实改变了我们服务器上的东西,我会很高兴我会打开我的书并开始修复......但他们说他们什么都没做过去一周。所以这对每个人来说都是更糟糕的故障排除!
猜你喜欢
  • 2014-07-08
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 2014-04-16
相关资源
最近更新 更多