【问题标题】:Writing in a file make my program load really slowly写入文件使我的程序加载速度非常慢
【发布时间】:2021-02-08 13:51:31
【问题描述】:

我正在尝试使用 fwrite/fputcsv 在循环中编写 csv 文件,但是当我使用这些函数时,它们会写入第一个文件,然后选项卡会无限加载并且不执行任何其他操作。
我知道这些函数是问题所在,因为当我删除它们时,其余代码会正常运行。

这是我的代码:

<?php

$auth = '';
$date = getdate(); //Needed for the Trade lists files

$path = array(
    'Some_folder/file1.csv',
    'Some_folder/file2.csv',
    'Some_folder/file3.csv',
    'Some_folder/file4.csv'
);//Full path the files need to be in
$file = array(
    pathinfo($path[0])['basename'],
    pathinfo($path[1])['basename'],
    pathinfo($path[2])['basename'],
    pathinfo($path[3])['basename']
);//The names the files will have
$fp = array(
    fopen($file[0], 'w+'), 
    fopen($file[1], 'w+'),
    fopen($file[2], 'w+'),
    fopen($file[3], 'w+')
);// Files that are create by fopen

for($i = 0; $i < 4; $i++) {
    fputcsv($fp[$i], $file);
    echo 'test';
    $size = filesize($path[$i]);
    $cheaders = array('Authorization: Bearer ' .$auth.'[Private access token]',
    'Content-Type: application/octet-stream',
    'Dropbox-API-Arg: {"path":"/'.$file[$i].'", "mode":"add"}');

    $ch = curl_init('[Private information]');
    curl_setopt($ch, CURLOPT_HTTPHEADER, $cheaders);
    curl_setopt($ch, CURLOPT_PUT, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_INFILE, $fp[$i]);
    curl_setopt($ch, CURLOPT_INFILESIZE, $size);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);

    curl_close($ch);
    fclose($fp[$i]);
}

?>

fputcsv 和 fwrite 确实写入第一个文件 (file1.csv),但它们使程序陷入无限加载。控制台什么也没说,因为我无法加载页面而且我不知道还能尝试/做什么。我试图寻找解决方案,不幸的是我没有找到它,所以我在这里。我仍然会寻找遮阳篷,但如果有人有解决方案,我也会接受。

感谢所有愿意提供帮助的人。

编辑:它终于加载了,但是从大约一个小时前开始加载以来,它花了很长时间。是不是我做错了什么,我的程序写得这么慢,在文件中写得这么慢?

【问题讨论】:

  • oo 请注意,您的 $file 变量没有采用每个文件的绝对路径,您在 $fp 处理程序中仅采用文件的基本名称
  • 那是因为我的 fopen 在当前目录中创建了文件。问题是,如果我只写文件,它需要不到 10 秒,如果我只上传文件同样的事情,但是当我结合编写和上传时,我的程序变得非常慢。运行它大约需要一个小时。
  • 尝试调试代码,看看是什么消耗了时间。我认为这是您使用的 API 在上传文件时响应缓慢。也可以尝试cURL手动上传单个文件,看看api是否需要时间来传输文件
  • 上传很耗时,但前提是写作部分也在这里。如果我在文件中手动输入数据,上传速度很快。
  • 是dropbox上传api耗时还是你的服务器第一次上传?

标签: php fwrite fputcsv


【解决方案1】:

我建议您将任务分成两个部分。首先使用fopenw 模式下将文件写入您的服务器。写入后,使用另一个循环在r 模式下使用fopen 读取文件,以便在您的cURL 中使用以上传到服务器。使用相同的处理程序进行写入和上传可能会导致滞后问题。

您可以使用curl_multi_init 异步处理多个 cURL 请求。 Here 也是一个帖子。

【讨论】:

    最近更新 更多