我有一个PHP文件(网站上的功能) - 允许用户从他的帐户导入另一个网站上的数据
每次他想要导入数据时,我还需要从那里复制很多图像
例如。 500张照片,每张300-500Kb是最小的。对于一个用户,预计这个数字很容易成为2000个图像。
每张图片的步骤如下:
执行此代码已经花了很长时间(超过8分钟)
我意识到这是很多数据,但还有另一种可行的方法吗?
也许在背景上进行复制,或同时复制许多照片
只是想知道是否有专门为此设计的技术,我不知道
或者除了将图像外包工作到一些图像托管服务器并且只保留缩略图之外别无他法。
感谢。
答案 0 :(得分:3)
这里没有太多的信息要做。正在使用什么操作系统? “远程”如何是源站点?图片的格式是什么?
如果另一个站点是远程站点(即另一个托管公司),那么您将遇到的主要问题是源服务器可以将数据传输到您的计算机的速度。
一个很大的问题是“目前图像的格式是什么?”。如果图像已经是JPEG,则再次检索然后再转换为JPEG将降低质量(尽管略有下降)。更好的办法是直接复制图像文件。这将消除PHP应用程序重新编码JPEG所需的时间。问问自己 - 你真的需要转换图片吗?
根据您可用的操作系统命令,您最好调用处理传输的应用程序(例如Linux中的wget
)。我已经使用wget
将文件从远程服务器检索到本地服务器,并且运行起来并不困难。
请记住 - 您转移的步骤越多,花费的时间就越长。目前,你有:
全部由PHP处理(可能从最慢到最快)
源主机是否为客户提供存档或导出工具?如果是这样,是否可以利用它来整体传输文件?
尽可能多地利用PHP将使这个过程更快。调用系统函数(例如wget
,ftp
,ssh
,imagemagick
等)会使事情变得更快(在PHP 和 Apache之外)
答案 1 :(得分:1)
线程似乎是明显的答案......
https://github.com/krakjoe/pthreads
在一个似乎有数百人说PHP没有线程可能性的海洋中,我是一个声音......我认为当前转向卷曲为你做线程的趋势只是很差,而且呐喊是一个更糟糕的解决方案,这些事情的开销一定是可怕的......
PHP总是拥有多线程的工具,如果没有它们就不会有它,因为它不支持任何多线程Web服务器。这只是它不是语言的设计目标,到目前为止将用户线程带到PHP的外部努力是不可用的,甚至在谷歌代码上都不存在......我要求PHP为即将到来的项目提供线程,所以线程我将......并且你和其他所有人一样,这是我送给世界/网络的礼物,享受:)
答案 2 :(得分:0)
设置某种类型的队列来处理图像导入 - 这样用户就不会等待,脚本也不会超时。
答案 3 :(得分: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并行运行多个请求来改进它。