我们的系统每小时生成各种发票并将其上传到云端。也可以通过单击我们前端的按钮来按需创建发票。
当手动请求创建所述发票时,它永远不会上传失败。至于 cron 在一段时间后生成的发票,所有上传都失败了:
Client error response
[status code] 401
[reason phrase] Unauthorized
[url] https://storage101.dfw1.clouddrive.com/v1/MossoCloudFS_930575/ <...> .pdf" @ Guzzle\Http\Exception\BadResponseException->factory
这应该意味着令牌可能已经过期。Rackspace 令牌持续 24 小时,但 Laravel 的存储应该自动刷新令牌。
现在这里有一些有趣的事实:
1) 每次使用 Capistrano 部署我们的代码时,令牌似乎都会刷新,并且 cron 上传会再次工作一段时间。这里要注意的重要一点是,每次部署都会创建一个类似于此的新文件夹来/releases/201605190925
提取代码,从头开始安装依赖项,如果一切顺利,则将此文件夹与 Apache 显示的文件夹进行符号链接。
2) Laravel 作业在与 www-data 不同的进程上处理
3) 部署后上传工作是否超过 24 小时很难追踪。我怀疑有时它的作用不止于此。但很难追踪,因为并非每个小时都有需要生成的发票。部署的开发人员不仅仅是我等。
4) 当 cron 失败并且我收到失败通知时,我可以立即去成功生成发票。之后,cron仍然失败。因此,这两个实例似乎在某处存储了不同的令牌。
5)缓存清理php artisan cache:clear
似乎没有任何影响
6) 可能尝试过重启 Apache 服务但没有结果
由于它已经持续了一段时间,我已经测试了各种东西,甚至有一次联系了 Rackspace,但他们从他们的结尾找不到任何奇怪的东西......提醒我只是为了捕捉 401 错误,更新令牌并尝试再次。但是 Laravel 和 Flysystem 应该在某个地方自己处理它
由于 Flysystem、Laravel 和 Rackspace 似乎没有其他人遇到类似问题,我怀疑这是 cron 进程的某种独特问题。我只是希望很快我们就可以准备好系统的重构版本,并且问题就会消失。至于现在它仍在开发中,可能还需要一个月的时间。
不要认为它与代码有关,但无论如何这里是上传行:
Storage::put($folder . '/' . $filename, file_get_contents($filePath));
这是我们的配置:
'default' => 'rackspace',
'disks' => [
'rackspace' => [
'driver' => 'rackspace',
'username' => ' ... ',
'key' => ' ... ',
'container' => ' ... ',
'endpoint' => 'https://identity.api.rackspacecloud.com/v2.0/',
'region' => 'DFW',
]
]
对此事的任何想法表示赞赏。