我需要通过 PHP 脚本生成一个文件(如 excel )并上传到服务器,供用户下载。
一般文件不大的情况,用户在页面上点击下载,再去数据库取数据,设置 heder 头以流的形式输出到浏览器,并且制定文件类型的方式下载,这当然是可以的,但是问题是现在生成一个文件可能非常大,并且很耗时,所以要做成异步的方式,用户点击下载就入一个任务到队列,在 Shell 脚本中以计划任务的形式读取队列任务,然后生成一个文件并且上传到服务器呢,这种情况如何解决?
1
tanteng OP 我尝试在 PHP 中创建一个临时文件,把数据写到临时文件,但是发现这个临时文件是 resource 类型,无法通过上次函数上传,函数参数要求必须是目录名称,而传进去的是资源型
|
2
Felldeadbird 2016-03-10 00:02:19 +08:00 via iPhone
可以 php 生成文件,然后交由 shell 脚本做上传…
|
3
mhycy 2016-03-10 01:35:20 +08:00
上传文件用 CURL 即可
但是用户点击下载就加入队列,那么不是等于用户啥都没收到么? 剩下的操作如何实现? |
4
zhs227 2016-03-10 01:48:03 +08:00
PHP 的脚本一般是只能运行几十秒的,在 WEB 环境上不适合跑耗时任务。应该弄个队列,队列由其它方式来处理,比如 PHP CLI , Python 等,处理完了以后再调用回调设置 Web 端状态。
|
5
Strikeactor 2016-03-10 01:48:32 +08:00
PHP 运行环境和文件下载服务器分开的?
我感觉折腾上传你不如搞个反代,用户点击完在 PHP 运行环境本地生成文件,然后返回远程服务器地址的 302 跳转,远程的下载服务器反代你 PHP 运行环境的目录,需要维持供后续下载的话就在反代上再设置一层缓存 |
6
yangqi 2016-03-10 05:15:37 +08:00
|
7
techmoe 2016-03-10 06:13:32 +08:00 via Android
点下载加到队列里后台写接口前端写轮询过去查进度呗。。
|
8
dawniii 2016-03-10 08:44:44 +08:00
加入队列了,用户什么也下载不到,前端轮询去等队列吗。貌似还是很耗时?
还有就是,本来就在服务器生成了,为何还要上传呢。。。 如果大家下载的文件内容都相同的话,我建议你可以写个计划任务,例如每小时在服务器更新一次这个文件。下载地址不变。 |
9
ershisi 2016-03-10 08:54:23 +08:00
远程的服务器是可控的不?如果是可控的。你在远程服务器上写一个接口,然后本地 curl 一下获取返回的地址就可以了。没必要本地生成再上传服务器。这一来一去的网络耗时就挺没有意义了。
|