4

我有一个 PHP 文件(网站上的功能) - 允许用户从他的帐户在另一个网站上导入数据。
每次他想导入数据时,我还需要从那里复制很多图像。
例如 500 张图片,每张最少 300-500Kb。预计这个数字很容易成为一个用户的 2000 张图像。

每张图片的步骤如下:

  • 获取图片地址
  • 从 URL 制作图像(使用 imagecreatefromjpeg 等)
  • 将其保存在我的服务器上(使用 imagejpeg、imagepng 等功能)

执行此代码已经花费了很长时间(超过 8 分钟)。
我意识到这是很多数据,但是还有另一种可能的方法吗?
也许在后台运行复制,或同时复制多张照片。
就是想知道有没有专门为此设计的技术,我也不知道。
或者除了将图像工作外包给某些图像托管服务器并仅保留缩略图之外,别无他法。

谢谢。

4

4 回答 4

3

这里没有太多信息可以继续。正在使用什么操作系统?源站点有多“远程”?图像已经采用什么格式?

如果另一个站点是远程的(即不同的托管公司),您将遇到的主要问题是源服务器将数据传送到您的机器的速度。

不过,一个大问题是“目前图像的格式是什么?”。如果图像已经是 JPEG,则检索然后再次转换为 JPEG 会降低质量(尽管会稍微降低)。更好的做法是直接复制图像文件。这将消除您的 PHP 应用程序重新编码 JPEG 所花费的时间。问问自己——你真的需要转换图像吗?

根据您可用的操作系统命令,您最好调用处理传输的应用程序(例如wget在 Linux 中)。我曾经wget将文件从远程服务器检索到本地服务器,并且运行起来并不难。

请记住 - 您在转移过程中的步骤越多,所需的时间就越长。目前,您有:

  • 恢复
  • 转换
  • 写作

全部由 PHP 处理(可能从最慢到最快)

源主机是否为客户提供存档或导出工具?如果是这样,那可以用来批量传输文件吗?

尽可能多地使用 PHP 将使过程更快。调用系统函数(例如 , ,wget等)会使事情变得更快(PHPApache 之外)ftpsshimagemagick

于 2012-09-12T12:16:50.687 回答
1

线程似乎是显而易见的答案......

https://github.com/krakjoe/pthreads

我是数百人中的一个声音,似乎有数百人说 PHP 没有线程的可能性......我认为目前转向 curl 为你做线程的趋势很差,并且吹捧为一个更糟糕的解决方案,这些事情的开销一定是可怕的......

PHP 一直都有多线程工具,如果没有它们,它就不会是现在的样子,因为它不会支持任何多线程 Web 服务器。只是它不是该语言的设计目标,迄今为止将用户级线程引入 PHP 的外部努力是不可用的,甚至在 google 代码中都不存在……我要求 PHP 为即将到来的项目提供线程,所以线程我将拥有......你和其他所有人也应该如此,这是我给世界/网络的礼物,享受:)

于 2012-09-13T19:32:48.953 回答
0
  1. 设置某种队列来处理图像导入——这样用户就不会等待,脚本也不会超时。

  2. 尝试使用curl_multi_init()运行并行请求

于 2012-09-12T12:03:09.647 回答
0

这是一个 PHP 函数,可用于将文件从 Internet($url 参数)下载到服务器上的本地文件($file_path 参数):

function download_file($url, $file_path) {
   $out = fopen($file_path, 'wb');
   if ($out == FALSE){
      print "File not opened<br>";
      exit;
   }

   $ch = curl_init();
   curl_setopt($ch, CURLOPT_FILE, $out);
   curl_setopt($ch, CURLOPT_HEADER, 0);
   curl_setopt($ch, CURLOPT_URL, $url);   
   curl_exec($ch);
   //echo "<br>Error is : ".curl_error ( $ch);
   curl_close($ch);
   fclose($out);
}

你可以这样称呼它:

$url = 'http://upload.wikimedia.org/wikipedia/commons/thumb/1/1f/Iss030e015472_Edit.jpg/352px-Iss030e015472_Edit.jpg';
download_file($url,'/var/www/www.mysite.com/public_html/images/image_user1.jpg');

确保您将文件保存到的文件夹对您的 apache 用户具有写入权限。还要确保您已加载 cURL php 扩展以使其正常工作。

此功能应该比您的imagecreatefromjpeg方法快得多。尝试一下,如果您仍然觉得它对您来说很慢,您可以按照 Gabriel 的建议,通过实现一个队列以与curl_multi_init并行运行多个请求来改进它。

于 2012-09-12T12:33:33.323 回答