如何在 PHP Shell 脚本中生成一个文件并上传到服务器?

2016-03-09 23:41:38 +08:00
 tanteng

我需要通过 PHP 脚本生成一个文件(如 excel )并上传到服务器,供用户下载。

一般文件不大的情况,用户在页面上点击下载,再去数据库取数据,设置 heder 头以流的形式输出到浏览器,并且制定文件类型的方式下载,这当然是可以的,但是问题是现在生成一个文件可能非常大,并且很耗时,所以要做成异步的方式,用户点击下载就入一个任务到队列,在 Shell 脚本中以计划任务的形式读取队列任务,然后生成一个文件并且上传到服务器呢,这种情况如何解决?

2747 次点击
所在节点    PHP
9 条回复
tanteng
2016-03-09 23:47:17 +08:00
我尝试在 PHP 中创建一个临时文件,把数据写到临时文件,但是发现这个临时文件是 resource 类型,无法通过上次函数上传,函数参数要求必须是目录名称,而传进去的是资源型
Felldeadbird
2016-03-10 00:02:19 +08:00
可以 php 生成文件,然后交由 shell 脚本做上传…
mhycy
2016-03-10 01:35:20 +08:00
上传文件用 CURL 即可

但是用户点击下载就加入队列,那么不是等于用户啥都没收到么?
剩下的操作如何实现?
zhs227
2016-03-10 01:48:03 +08:00
PHP 的脚本一般是只能运行几十秒的,在 WEB 环境上不适合跑耗时任务。应该弄个队列,队列由其它方式来处理,比如 PHP CLI , Python 等,处理完了以后再调用回调设置 Web 端状态。
Strikeactor
2016-03-10 01:48:32 +08:00
PHP 运行环境和文件下载服务器分开的?
我感觉折腾上传你不如搞个反代,用户点击完在 PHP 运行环境本地生成文件,然后返回远程服务器地址的 302 跳转,远程的下载服务器反代你 PHP 运行环境的目录,需要维持供后续下载的话就在反代上再设置一层缓存
yangqi
2016-03-10 05:15:37 +08:00
你需要的是一个 queue, beanstalkd

http://kr.github.io/beanstalkd/
techmoe
2016-03-10 06:13:32 +08:00
点下载加到队列里后台写接口前端写轮询过去查进度呗。。
dawniii
2016-03-10 08:44:44 +08:00
加入队列了,用户什么也下载不到,前端轮询去等队列吗。貌似还是很耗时?

还有就是,本来就在服务器生成了,为何还要上传呢。。。

如果大家下载的文件内容都相同的话,我建议你可以写个计划任务,例如每小时在服务器更新一次这个文件。下载地址不变。
ershisi
2016-03-10 08:54:23 +08:00
远程的服务器是可控的不?如果是可控的。你在远程服务器上写一个接口,然后本地 curl 一下获取返回的地址就可以了。没必要本地生成再上传服务器。这一来一去的网络耗时就挺没有意义了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/262357

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX