failed to open stream – 永夜 https://www.shuijingwanwq.com 没有不值得去解决的问题,也没有不值得去学习的技术! Fri, 15 May 2026 10:31:39 +0000 zh-Hans hourly 1 https://wordpress.org/?v=7.0 Class “Vtiful\Kernel\Excel” not found,php-ext-xlswriter 使用过程中的问题排查 https://www.shuijingwanwq.com/2024/03/07/8459/ https://www.shuijingwanwq.com/2024/03/07/8459/#respond Thu, 07 Mar 2024 01:56:23 +0000 https://www.shuijingwanwq.com/?p=8459 Post Views: 248 1、报错:Class “Vtiful\Kernel\Excel” not found。 2、原因在于扩展 php-ext-xlswriter 未安装。 3、GitHub Release:https://github.com/viest/php-ext-xlswriter/releases 下载 php-windows-xlswriter-cf7e1933-8.1-ts-vs16-x64.zip 。如图1
GitHub Release:https://github.com/viest/php-ext-xlswriter/releases 下载 php-windows-xlswriter-cf7e1933-8.1-ts-vs16-x64.zip

图1

4、解压缩后,复制 php_xlswriter.dll 至 C:\php-8.1.27\ext\php_xlswriter.dll 5、编辑 php.ini,添加 extension=xlswriter 6、重启 PHP 后,再次报错:[ERROR] workbook_close(): Error creating ‘E:\wwwroot\object\storage\app\export/order/订单导出任务2024-02-19 10:24:06.xls’. Error = No error。如图2
重启 PHP 后,再次报错:[ERROR] workbook_close(): Error creating 'E:\wwwroot\object\storage\app\export/order/订单导出任务2024-02-19 10:24:06.xls'. Error = No error

图2

7、查看表 failed_jobs 中的异常详细信息:ErrorException: fopen(E:\wwwroot\object\storage\app\export/order/订单导出任务2024-02-19 10:24:06.xls): Failed to open stream: No such file or directory in


	$path = Storage::disk($this->disk)->putFileAs(
		$this->basePath,
		$this->excel->output(),
		basename($this->excel->{'localFileName'})
	);




ErrorException: fopen(E:\wwwroot\object\storage\app\export/order/订单导出任务2024-02-19 10:24:06.xls): Failed to open stream: No such file or directory in E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Filesystem\FilesystemAdapter.php:396
Stack trace:
#0 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Foundation\Bootstrap\HandleExceptions.php(259): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(2, 'fopen(E:\\wwwroo...', 'E:\\wwwroot\\erp-...', 396)
#1 [internal function]: Illuminate\Foundation\Bootstrap\HandleExceptions->Illuminate\Foundation\Bootstrap\{closure}(2, 'fopen(E:\\wwwroo...', 'E:\\wwwroot\\erp-...', 396)
#2 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Filesystem\FilesystemAdapter.php(396): fopen('E:\\wwwroot\\erp-...', 'r')
#3 E:\wwwroot\object\app\Services\ExportService.php(81): Illuminate\Filesystem\FilesystemAdapter->putFileAs('export/order', 'E:\\wwwroot\\erp-...', '\xE8\xAE\xA2\xE5\x8D\x95\xE5\xAF\xBC\xE5\x87\xBA\xE4\xBB\xBB...')
#4 E:\wwwroot\object\Modules\Order\Services\OrderExportService.php(593): App\Services\ExportService->save()
#5 E:\wwwroot\object\Modules\Order\Services\OrderExportService.php(230): Modules\Order\Services\OrderExportService->exportCheck(Array, Array, '\xE8\xAE\xA2\xE5\x8D\x95\xE5\xAF\xBC\xE5\x87\xBA\xE4\xBB\xBB...')
#6 E:\wwwroot\object\Modules\Order\Jobs\OrderExportJob.php(52): Modules\Order\Services\OrderExportService->exportOrderExcel(Array, Object(App\Models\JobStatus))
#7 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(36): Modules\Order\Jobs\OrderExportJob->handle()
#8 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Util.php(41): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#9 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
#10 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#11 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Container.php(651): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#12 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Bus\Dispatcher.php(128): Illuminate\Container\Container->call(Array)
#13 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(141): Illuminate\Bus\Dispatcher->Illuminate\Bus\{closure}(Object(Modules\Order\Jobs\OrderExportJob))
#14 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Modules\Order\Jobs\OrderExportJob))
#15 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Bus\Dispatcher.php(132): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#16 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\CallQueuedHandler.php(124): Illuminate\Bus\Dispatcher->dispatchNow(Object(Modules\Order\Jobs\OrderExportJob), false)
#17 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(141): Illuminate\Queue\CallQueuedHandler->Illuminate\Queue\{closure}(Object(Modules\Order\Jobs\OrderExportJob))
#18 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Modules\Order\Jobs\OrderExportJob))
#19 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\CallQueuedHandler.php(126): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#20 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\CallQueuedHandler.php(70): Illuminate\Queue\CallQueuedHandler->dispatchThroughMiddleware(Object(Illuminate\Queue\Jobs\RedisJob), Object(Modules\Order\Jobs\OrderExportJob))
#21 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Jobs\Job.php(98): Illuminate\Queue\CallQueuedHandler->call(Object(Illuminate\Queue\Jobs\RedisJob), Array)
#22 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Worker.php(425): Illuminate\Queue\Jobs\Job->fire()
#23 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Worker.php(375): Illuminate\Queue\Worker->process('redis', Object(Illuminate\Queue\Jobs\RedisJob), Object(Illuminate\Queue\WorkerOptions))
#24 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Worker.php(173): Illuminate\Queue\Worker->runJob(Object(Illuminate\Queue\Jobs\RedisJob), 'redis', Object(Illuminate\Queue\WorkerOptions))
#25 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Console\WorkCommand.php(150): Illuminate\Queue\Worker->daemon('redis', 'export_queue', Object(Illuminate\Queue\WorkerOptions))
#26 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Console\WorkCommand.php(134): Illuminate\Queue\Console\WorkCommand->runWorker('redis', 'export_queue')
#27 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(36): Illuminate\Queue\Console\WorkCommand->handle()
#28 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Util.php(41): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#29 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
#30 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#31 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Container.php(651): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#32 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Console\Command.php(144): Illuminate\Container\Container->call(Array)
#33 E:\wwwroot\object\vendor\symfony\console\Command\Command.php(312): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#34 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Console\Command.php(126): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#35 E:\wwwroot\object\vendor\symfony\console\Application.php(1022): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#36 E:\wwwroot\object\vendor\symfony\console\Application.php(314): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Queue\Console\WorkCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#37 E:\wwwroot\object\vendor\symfony\console\Application.php(168): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#38 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Console\Application.php(102): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#39 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Foundation\Console\Kernel.php(151): Illuminate\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#40 E:\wwwroot\object\artisan(37): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#41 {main}


8、决定从 PHP 官网下载:https://pecl.php.net/package/xlswriter/1.5.1/windows 。8.1 Thread Safe (TS) x64。 9、报错:Worksheet row or column index out of range. 参考:异常码列表 。https://xlswriter-docs.viest.me/zh-cn/exception/code 。工作表的行或列索引超出Excel规定范围,请检查数组键值。如图3
报错:Worksheet row or column index out of range. 参考:异常码列表 。https://xlswriter-docs.viest.me/zh-cn/exception/code 。工作表的行或列索引超出Excel规定范围,请检查数组键值

图3



Vtiful\Kernel\Exception: Worksheet row or column index out of range. in E:\wwwroot\object\app\Services\ExportService.php:107
Stack trace:
#0 E:\wwwroot\object\app\Services\ExportService.php(107): Vtiful\Kernel\Excel->data(Array)
#1 E:\wwwroot\object\Modules\Order\Services\OrderExportService.php(581): App\Services\ExportService->writeRows(Array)
#2 E:\wwwroot\object\Modules\Order\Services\OrderExportService.php(230): Modules\Order\Services\OrderExportService->exportCheck(Array, Array, '\xE8\xAE\xA2\xE5\x8D\x95\xE5\xAF\xBC\xE5\x87\xBA\xE4\xBB\xBB...')
#3 E:\wwwroot\object\Modules\Order\Jobs\OrderExportJob.php(52): Modules\Order\Services\OrderExportService->exportOrderExcel(Array, Object(App\Models\JobStatus))
#4 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(36): Modules\Order\Jobs\OrderExportJob->handle()
#5 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Util.php(41): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#6 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
#7 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#8 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Container.php(651): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#9 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Bus\Dispatcher.php(128): Illuminate\Container\Container->call(Array)
#10 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(141): Illuminate\Bus\Dispatcher->Illuminate\Bus\{closure}(Object(Modules\Order\Jobs\OrderExportJob))
#11 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Modules\Order\Jobs\OrderExportJob))
#12 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Bus\Dispatcher.php(132): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#13 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\CallQueuedHandler.php(124): Illuminate\Bus\Dispatcher->dispatchNow(Object(Modules\Order\Jobs\OrderExportJob), false)
#14 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(141): Illuminate\Queue\CallQueuedHandler->Illuminate\Queue\{closure}(Object(Modules\Order\Jobs\OrderExportJob))
#15 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Modules\Order\Jobs\OrderExportJob))
#16 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\CallQueuedHandler.php(126): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#17 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\CallQueuedHandler.php(70): Illuminate\Queue\CallQueuedHandler->dispatchThroughMiddleware(Object(Illuminate\Queue\Jobs\RedisJob), Object(Modules\Order\Jobs\OrderExportJob))
#18 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Jobs\Job.php(98): Illuminate\Queue\CallQueuedHandler->call(Object(Illuminate\Queue\Jobs\RedisJob), Array)
#19 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Worker.php(425): Illuminate\Queue\Jobs\Job->fire()
#20 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Worker.php(375): Illuminate\Queue\Worker->process('redis', Object(Illuminate\Queue\Jobs\RedisJob), Object(Illuminate\Queue\WorkerOptions))
#21 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Worker.php(173): Illuminate\Queue\Worker->runJob(Object(Illuminate\Queue\Jobs\RedisJob), 'redis', Object(Illuminate\Queue\WorkerOptions))
#22 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Console\WorkCommand.php(150): Illuminate\Queue\Worker->daemon('redis', 'export_queue', Object(Illuminate\Queue\WorkerOptions))
#23 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Console\WorkCommand.php(134): Illuminate\Queue\Console\WorkCommand->runWorker('redis', 'export_queue')
#24 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(36): Illuminate\Queue\Console\WorkCommand->handle()
#25 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Util.php(41): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#26 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
#27 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#28 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Container.php(651): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#29 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Console\Command.php(144): Illuminate\Container\Container->call(Array)
#30 E:\wwwroot\object\vendor\symfony\console\Command\Command.php(312): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#31 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Console\Command.php(126): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#32 E:\wwwroot\object\vendor\symfony\console\Application.php(1022): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#33 E:\wwwroot\object\vendor\symfony\console\Application.php(314): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Queue\Console\WorkCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#34 E:\wwwroot\object\vendor\symfony\console\Application.php(168): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#35 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Console\Application.php(102): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#36 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Foundation\Console\Kernel.php(151): Illuminate\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#37 E:\wwwroot\object\artisan(37): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#38 {main}

Next Vtiful\Kernel\Exception: Worksheet row or column index out of range. in E:\wwwroot\object\app\Services\ExportService.php:107
Stack trace:
#0 E:\wwwroot\object\app\Services\ExportService.php(107): Vtiful\Kernel\Excel->data(Array)
#1 E:\wwwroot\object\Modules\Order\Services\OrderExportService.php(581): App\Services\ExportService->writeRows(Array)
#2 E:\wwwroot\object\Modules\Order\Services\OrderExportService.php(230): Modules\Order\Services\OrderExportService->exportCheck(Array, Array, '\xE8\xAE\xA2\xE5\x8D\x95\xE5\xAF\xBC\xE5\x87\xBA\xE4\xBB\xBB...')
#3 E:\wwwroot\object\Modules\Order\Jobs\OrderExportJob.php(52): Modules\Order\Services\OrderExportService->exportOrderExcel(Array, Object(App\Models\JobStatus))
#4 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(36): Modules\Order\Jobs\OrderExportJob->handle()
#5 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Util.php(41): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#6 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
#7 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#8 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Container.php(651): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#9 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Bus\Dispatcher.php(128): Illuminate\Container\Container->call(Array)
#10 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(141): Illuminate\Bus\Dispatcher->Illuminate\Bus\{closure}(Object(Modules\Order\Jobs\OrderExportJob))
#11 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Modules\Order\Jobs\OrderExportJob))
#12 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Bus\Dispatcher.php(132): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#13 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\CallQueuedHandler.php(124): Illuminate\Bus\Dispatcher->dispatchNow(Object(Modules\Order\Jobs\OrderExportJob), false)
#14 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(141): Illuminate\Queue\CallQueuedHandler->Illuminate\Queue\{closure}(Object(Modules\Order\Jobs\OrderExportJob))
#15 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Modules\Order\Jobs\OrderExportJob))
#16 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\CallQueuedHandler.php(126): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#17 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\CallQueuedHandler.php(70): Illuminate\Queue\CallQueuedHandler->dispatchThroughMiddleware(Object(Illuminate\Queue\Jobs\RedisJob), Object(Modules\Order\Jobs\OrderExportJob))
#18 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Jobs\Job.php(98): Illuminate\Queue\CallQueuedHandler->call(Object(Illuminate\Queue\Jobs\RedisJob), Array)
#19 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Worker.php(425): Illuminate\Queue\Jobs\Job->fire()
#20 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Worker.php(375): Illuminate\Queue\Worker->process('redis', Object(Illuminate\Queue\Jobs\RedisJob), Object(Illuminate\Queue\WorkerOptions))
#21 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Worker.php(173): Illuminate\Queue\Worker->runJob(Object(Illuminate\Queue\Jobs\RedisJob), 'redis', Object(Illuminate\Queue\WorkerOptions))
#22 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Console\WorkCommand.php(150): Illuminate\Queue\Worker->daemon('redis', 'export_queue', Object(Illuminate\Queue\WorkerOptions))
#23 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Console\WorkCommand.php(134): Illuminate\Queue\Console\WorkCommand->runWorker('redis', 'export_queue')
#24 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(36): Illuminate\Queue\Console\WorkCommand->handle()
#25 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Util.php(41): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#26 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
#27 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#28 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Container.php(651): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#29 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Console\Command.php(144): Illuminate\Container\Container->call(Array)
#30 E:\wwwroot\object\vendor\symfony\console\Command\Command.php(312): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#31 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Console\Command.php(126): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#32 E:\wwwroot\object\vendor\symfony\console\Application.php(1022): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#33 E:\wwwroot\object\vendor\symfony\console\Application.php(314): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Queue\Console\WorkCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#34 E:\wwwroot\object\vendor\symfony\console\Application.php(168): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#35 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Console\Application.php(102): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#36 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Foundation\Console\Kernel.php(151): Illuminate\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#37 E:\wwwroot\object\artisan(37): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#38 {main}



10、最终发现原因在于:$this->excel->data($data); $data 的数组为关联数组所导致。当为索引数组后,不再报错:Worksheet row or column index out of range.。继续报错:[ERROR] workbook_close(): Error creating。最终决定不修改代码,继续使用 php-windows-xlswriter-cf7e1933-8.1-ts-vs16-x64,就自动兼容了关联数组。


[
  {
    "plat_order_no": "GM20240204031613_3",
    "transaction_no": "202402041"
  }
]




[
  [
    "GM20240204031613_3",
    "202402041"
  ]
]


11、最终找到直接原因,在于 output() 时,Excel 文件未生成成功。根本原因在于 fileName(); 的参数中包含了 : ,进而导致 Excel 文件未生成。将一个 xls 文件重命名为:订单导出任务2024-02-19 17:42:32,会自动调整为:订单导出任务2024-02-19 174232。提示:文件名不能包含下列任何字符: \\:*?”<<>| 。如图4
最终找到直接原因,在于 output() 时,Excel 文件未生成成功。根本原因在于 fileName(); 的参数中包含了 : ,进而导致 Excel 文件未生成。将一个 xls 文件重命名为:订单导出任务2024-02-19 17:42:32,会自动调整为:订单导出任务2024-02-19 174232。提示:文件名不能包含下列任何字符: \\:*?"<<>|

图4

12、将文件名中的 : 替换为 _ 后。导出 Excel 文件成功。]]>
https://www.shuijingwanwq.com/2024/03/07/8459/feed/ 0
在 PHP 7.4 中,使用 file_put_contents 时,报错:failed to open stream: No such file or directory https://www.shuijingwanwq.com/2023/03/08/7456/ https://www.shuijingwanwq.com/2023/03/08/7456/#respond Wed, 08 Mar 2023 01:06:35 +0000 https://www.shuijingwanwq.com/?p=7456 Post Views: 71 1、在 PHP 7.4 中,使用 file_put_contents 时,报错:failed to open stream: No such file or directory。如图1
在 PHP 7.4 中,使用 file_put_contents 时,报错:failed to open stream: No such file or directory

图1



{
    "message": "file_put_contents(E:\\wwwroot\\object\\storage\/logs\/theme-cdn-config-2023-02-23-10:23:19.txt): failed to open stream: No such file or directory",
    "status_code": 500,
    "debug": {
        "line": 74,
        "file": "E:\\wwwroot\\object\\app\\Services\\ThemeService.php",
        "class": "ErrorException",
        "trace": [
            "#0 [internal function]: Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError(2, 'file_put_conten...', 'E:\\\\wwwroot\\\\wsho...', 74, Array)",
            "#1 E:\\wwwroot\\object\\app\\Services\\ThemeService.php(74): file_put_contents('E:\\\\wwwroot\\\\wsho...', 'Array\\n(\\n    [dr...', 10)",
            "#2 E:\\wwwroot\\object\\app\\Http\\Controllers\\Admin\\API\\ThemeController.php(42): App\\Services\\ThemeService->list()",
            "#3 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Controller.php(54): App\\Http\\Controllers\\Admin\\API\\ThemeController->index(Object(App\\Services\\ThemeService))",
            "#4 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction('index', Array)",
            "#5 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Route.php(219): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\Admin\\API\\ThemeController), 'index')",
            "#6 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Route.php(176): Illuminate\\Routing\\Route->runController()",
            "#7 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(681): Illuminate\\Routing\\Route->run()",
            "#8 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(130): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#9 E:\\wwwroot\\object\\app\\Http\\Middleware\\RoleOrPermissionMiddleware.php(32): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#10 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): App\\Http\\Middleware\\RoleOrPermissionMiddleware->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure), 'manage_themes|a...')",
            "#11 E:\\wwwroot\\object\\app\\Http\\Middleware\\CheckStoreAdminStatus.php(45): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#12 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): App\\Http\\Middleware\\CheckStoreAdminStatus->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#13 E:\\wwwroot\\object\\app\\Http\\Middleware\\SwitchLanguage.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#14 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): App\\Http\\Middleware\\SwitchLanguage->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#15 E:\\wwwroot\\object\\vendor\\dingo\\api\\src\\Http\\Middleware\\Auth.php(55): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#16 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Dingo\\Api\\Http\\Middleware\\Auth->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#17 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Auth\\Middleware\\Authenticate.php(43): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#18 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Illuminate\\Auth\\Middleware\\Authenticate->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure), 'api')",
            "#19 E:\\wwwroot\\object\\vendor\\dingo\\api\\src\\Http\\Middleware\\PrepareController.php(45): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#20 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Dingo\\Api\\Http\\Middleware\\PrepareController->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#21 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(105): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#22 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(683): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))",
            "#23 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(658): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Dingo\\Api\\Http\\Request))",
            "#24 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(624): Illuminate\\Routing\\Router->runRoute(Object(Dingo\\Api\\Http\\Request), Object(Illuminate\\Routing\\Route))",
            "#25 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(613): Illuminate\\Routing\\Router->dispatchToRoute(Object(Dingo\\Api\\Http\\Request))",
            "#26 E:\\wwwroot\\object\\vendor\\dingo\\api\\src\\Routing\\Adapter\\Laravel.php(88): Illuminate\\Routing\\Router->dispatch(Object(Dingo\\Api\\Http\\Request))",
            "#27 E:\\wwwroot\\object\\vendor\\dingo\\api\\src\\Routing\\Router.php(518): Dingo\\Api\\Routing\\Adapter\\Laravel->dispatch(Object(Dingo\\Api\\Http\\Request), 'v1')",
            "#28 E:\\wwwroot\\object\\vendor\\dingo\\api\\src\\Http\\Middleware\\Request.php(126): Dingo\\Api\\Routing\\Router->dispatch(Object(Dingo\\Api\\Http\\Request))",
            "#29 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(130): Dingo\\Api\\Http\\Middleware\\Request->Dingo\\Api\\Http\\Middleware\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#30 E:\\wwwroot\\object\\vendor\\barryvdh\\laravel-debugbar\\src\\Middleware\\InjectDebugbar.php(67): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#31 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#32 E:\\wwwroot\\object\\app\\Http\\Middleware\\ChangeAppUrlMiddleware.php(23): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#33 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): App\\Http\\Middleware\\ChangeAppUrlMiddleware->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#34 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#35 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#36 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#37 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#38 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#39 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#40 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode.php(63): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#41 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#42 E:\\wwwroot\\object\\vendor\\fideloper\\proxy\\src\\TrustProxies.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#43 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Fideloper\\Proxy\\TrustProxies->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#44 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(105): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#45 E:\\wwwroot\\object\\vendor\\dingo\\api\\src\\Http\\Middleware\\Request.php(127): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))",
            "#46 E:\\wwwroot\\object\\vendor\\dingo\\api\\src\\Http\\Middleware\\Request.php(103): Dingo\\Api\\Http\\Middleware\\Request->sendRequestThroughRouter(Object(Dingo\\Api\\Http\\Request))",
            "#47 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Dingo\\Api\\Http\\Middleware\\Request->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#48 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(105): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))",
            "#49 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(145): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))",
            "#50 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(110): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))",
            "#51 E:\\wwwroot\\object\\public\\index.php(57): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))",
            "#52 {main}"
        ]
    }
}


2、原因在于文件名:theme-cdn-config-2023-02-23-10:23:19.txt 格式不正确,里面包含 :,将 : 替换为 -,再次运行,不再报错。]]>
https://www.shuijingwanwq.com/2023/03/08/7456/feed/ 0
执行 php artisan config:clear 时,报错:ErrorException : include(E:\wwwroot\object\vendor\composer/../../Modules/ThemeStoreGraphQL/Providers/GraphQlResolverServiceProvider.php): failed to open stream: No such file or directory https://www.shuijingwanwq.com/2022/07/27/6826/ https://www.shuijingwanwq.com/2022/07/27/6826/#respond Wed, 27 Jul 2022 01:14:11 +0000 https://www.shuijingwanwq.com/?p=6826 Post Views: 124 1、执行 php artisan config:clear 时,报错:ErrorException : include(E:\wwwroot\object\vendor\composer/../../Modules/ThemeStoreGraphQL/Providers/GraphQlResolverServiceProvider.php): failed to open stream: No such file or directory。如图1
执行 php artisan config:clear 时,报错:ErrorException  : include(E:\wwwroot\object\vendor\composer/../../Modules/ThemeStoreGraphQL/Providers/GraphQlResolverServiceProvider.php): failed to open stream: No such file or directory

图1



PS E:\wwwroot\object> php artisan config:clear

   ErrorException  : include(E:\wwwroot\object\vendor\composer/../../Modules/ThemeStoreGraphQL/Providers/GraphQlResolverServiceProvider.php): failed to open stream: No such file or directory

  at E:\wwwroot\object\vendor\composer\ClassLoader.php:571
    567|  * @private
    568|  */
    569| function includeFile($file)
    570| {
  > 571|     include $file;
    572| }
    573|

  Exception trace:

  1   include()
      E:\wwwroot\object\vendor\composer\ClassLoader.php:571

  2   Composer\Autoload\includeFile("E:\wwwroot\object\vendor\composer/../../Modules/ThemeStoreGraphQL/Providers/GraphQlResolverServiceProvider.php")
      E:\wwwroot\object\vendor\composer\ClassLoader.php:428

  Please use the argument -v to see more details.


2、确认文件 Modules/ThemeStoreGraphQL/Providers/GraphQlResolverServiceProvider.php 已经不存在,被重命名为:Modules/OnlineStoreThemeGraphQL/Providers/GraphQlResolverServiceProvider.php 3、执行:composer install 命令,以重新生成 vendor\composer\ClassLoader.php。报错:In ProviderRepository.php line 208: Class ‘Modules\ThemeStoreGraphQL\Providers\GraphQlResolverServiceProvider’ not found Script @php artisan package:discover –ansi handling the post-autoload-dump event returned with error code 1。如图2
执行:composer install 命令,以重新生成 vendor\composer\ClassLoader.php。报错:In ProviderRepository.php line 208: Class 'Modules\ThemeStoreGraphQL\Providers\GraphQlResolverServiceProvider' not found Script @php artisan package:discover --ansi handling the post-autoload-dump event returned with error code 1

图2



PS E:\wwwroot\object> composer install
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Package operations: 0 installs, 29 updates, 0 removals
  ...
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi

In ProviderRepository.php line 208:

  Class 'Modules\ThemeStoreGraphQL\Providers\GraphQlResolverServiceProvider' not
  found


Script @php artisan package:discover --ansi handling the post-autoload-dump event returned with error code 1


4、原因在于 /config/app.php 的 providers 中包含:\Modules\ThemeStoreGraphQL\Providers\GraphQlResolverServiceProvider::class, 5、再次执行:composer install、php artisan config:clear,皆运行成功。


PS E:\wwwroot\object> composer install
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Nothing to install, update or remove
...
Package manifest generated successfully.
111 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
PS E:\wwwroot\object> php artisan config:clear
Configuration cache cleared!


   ]]>
https://www.shuijingwanwq.com/2022/07/27/6826/feed/ 0
基于 Laravel 6、 Guzzle 6 下载远程文件至服务器磁盘的实现 https://www.shuijingwanwq.com/2022/05/31/6475/ https://www.shuijingwanwq.com/2022/05/31/6475/#respond Tue, 31 May 2022 01:10:00 +0000 https://www.shuijingwanwq.com/?p=6475 Post Views: 124 1、现在正在尝试将远程的 ZIP 文件下载至服务器。 远程文件网址:https://www.shuijingwanwq.com/wp-content/uploads/2021/07/两位老人被两只狗给撞了.wmv 2、参考:https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html#sink 。声明响应的主体部分将要保存的位置。如图1
参考:https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html#sink 。声明响应的主体部分将要保存的位置

图1

3、参考:https://www.shuijingwanwq.com/2020/11/26/4627/ 。传入 fopen() 返回的资源将响应写入 PHP 流


    /**
     * 下载 ZIP
     * @param string $uri 文件的绝对 URI
     * @param string $absolutePath 文件的绝对路径(下载至的目标路径)
     * @return void
     */
    public function downloadZip($uri, $absolutePath) {
        // 实例化 HTTP 客户端
        $client = new Client;

        // 打开即将下载的本地文件,在该文件上打开一个流
        $resource = fopen($absolutePath, 'w');

        $client->get($uri, ['sink' => $resource]);
        // file_put_contents(storage_path() . '/logs/ZipHandler-downloadZip-absolutePath-' . microtime(true) . '-' . mt_rand()  . '.txt', print_r($response, true), FILE_APPEND | LOCK_EX);

        // 关闭一个已打开的文件指针
        fclose($resource);
    }


4、抛出异常:fopen(E:\wwwroot\object\storage/theme_downloads/2022/05/19/1652927525.7561.1655422634.zip): failed to open stream: No such file or directory


ErrorException: fopen(E:\wwwroot\object\storage/theme_downloads/2022/05/19/1652927525.7561.1655422634.zip): failed to open stream: No such file or directory in E:\wwwroot\object\Modules\ThemeStoreDB\Handlers\ZipHandler.php:20
Stack trace:
#0 [internal function]: Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(2, 'fopen(E:\\wwwroo...', 'E:\\wwwroot\\wsho...', 20, Array)
#1 E:\wwwroot\object\Modules\ThemeStoreDB\Handlers\ZipHandler.php(20): fopen('E:\\wwwroot\\wsho...', 'w')
#2 E:\wwwroot\object\Modules\ThemeStoreDB\Jobs\ThemeInstallationJob.php(61): Modules\ThemeStoreDB\Handlers\ZipHandler->downloadZip('https://www.shu...', 'E:\\wwwroot\\wsho...')
#3 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(36): Modules\ThemeStoreDB\Jobs\ThemeInstallationJob->handle()
#4 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Util.php(37): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#5 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
#6 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#7 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Container.php(590): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#8 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Bus\Dispatcher.php(94): Illuminate\Container\Container->call(Array)
#9 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(130): Illuminate\Bus\Dispatcher->Illuminate\Bus\{closure}(Object(Modules\ThemeStoreDB\Jobs\ThemeInstallationJob))
#10 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(105): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Modules\ThemeStoreDB\Jobs\ThemeInstallationJob))
#11 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Bus\Dispatcher.php(98): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#12 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\CallQueuedHandler.php(83): Illuminate\Bus\Dispatcher->dispatchNow(Object(Modules\ThemeStoreDB\Jobs\ThemeInstallationJob), false)
#13 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(130): Illuminate\Queue\CallQueuedHandler->Illuminate\Queue\{closure}(Object(Modules\ThemeStoreDB\Jobs\ThemeInstallationJob))
#14 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(105): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Modules\ThemeStoreDB\Jobs\ThemeInstallationJob))
#15 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\CallQueuedHandler.php(85): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#16 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\CallQueuedHandler.php(59): Illuminate\Queue\CallQueuedHandler->dispatchThroughMiddleware(Object(Illuminate\Queue\Jobs\RedisJob), Object(Modules\ThemeStoreDB\Jobs\ThemeInstallationJob))
#17 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Jobs\Job.php(88): Illuminate\Queue\CallQueuedHandler->call(Object(Illuminate\Queue\Jobs\RedisJob), Array)
#18 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Worker.php(368): Illuminate\Queue\Jobs\Job->fire()
#19 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Worker.php(314): Illuminate\Queue\Worker->process('redis', Object(Illuminate\Queue\Jobs\RedisJob), Object(Illuminate\Queue\WorkerOptions))
#20 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Worker.php(134): Illuminate\Queue\Worker->runJob(Object(Illuminate\Queue\Jobs\RedisJob), 'redis', Object(Illuminate\Queue\WorkerOptions))
#21 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Console\WorkCommand.php(112): Illuminate\Queue\Worker->daemon('redis', 'default', Object(Illuminate\Queue\WorkerOptions))
#22 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Console\WorkCommand.php(96): Illuminate\Queue\Console\WorkCommand->runWorker('redis', 'default')
#23 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(36): Illuminate\Queue\Console\WorkCommand->handle()
#24 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Util.php(37): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#25 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
#26 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#27 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Container.php(590): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#28 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Console\Command.php(134): Illuminate\Container\Container->call(Array)
#29 E:\wwwroot\object\vendor\symfony\console\Command\Command.php(255): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#30 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Console\Command.php(121): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#31 E:\wwwroot\object\vendor\symfony\console\Application.php(1009): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#32 E:\wwwroot\object\vendor\symfony\console\Application.php(273): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Queue\Console\WorkCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#33 E:\wwwroot\object\vendor\symfony\console\Application.php(149): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#34 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Console\Application.php(93): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#35 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Foundation\Console\Kernel.php(131): Illuminate\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#36 E:\wwwroot\object\artisan(37): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#37 {main}


5、需要先确保目录是存在的。判断目录是否存在,如果不存在,则递归创建。


        // 文件的相对路径
        $directory = '/theme_downloads/' . date('Y/m/d');

        // 判断目录是否存在,如果不存在,则递归创建
        if (!file_exists(storage_path('app') . $directory)) {
            // file_put_contents(storage_path() . '/logs/ThemeInstallationJob-handle-directory-' . microtime(true) . '-' . mt_rand()  . '.txt', print_r($directory, true), FILE_APPEND | LOCK_EX);
            Storage::disk('local')->makeDirectory($directory);
        }

        $uri = 'https://www.shuijingwanwq.com/wp-content/uploads/2022/05/theme-1.zip';
        $absolutePath = storage_path('app') . $directory . '/' . microtime(true) . '.' . mt_rand() . '.zip';
        // file_put_contents(storage_path() . '/logs/ThemeInstallationJob-handle-absolutePath-' . microtime(true) . '-' . mt_rand()  . '.txt', print_r($absolutePath, true), FILE_APPEND | LOCK_EX);
        app(ZipHandler::class)->downloadZip($uri, $absolutePath);


6、下载成功。但是如果下载:.zip 的文件,提示:fclose(): supplied resource is not a valid stream resource


ErrorException: fclose(): supplied resource is not a valid stream resource in E:\wwwroot\object\Modules\ThemeStoreDB\Handlers\ZipHandler.php:27
Stack trace:
#0 [internal function]: Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(2, 'fclose(): suppl...', 'E:\\wwwroot\\wsho...', 27, Array)
#1 E:\wwwroot\object\Modules\ThemeStoreDB\Handlers\ZipHandler.php(27): fclose(Resource id #1962)
#2 E:\wwwroot\object\Modules\ThemeStoreDB\Jobs\ThemeInstallationJob.php(71): Modules\ThemeStoreDB\Handlers\ZipHandler->downloadZip('https://www.shu...', 'E:\\wwwroot\\wsho...')
#3 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(36): Modules\ThemeStoreDB\Jobs\ThemeInstallationJob->handle()
#4 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Util.php(37): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#5 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
#6 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#7 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Container.php(590): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#8 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Bus\Dispatcher.php(94): Illuminate\Container\Container->call(Array)
#9 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(130): Illuminate\Bus\Dispatcher->Illuminate\Bus\{closure}(Object(Modules\ThemeStoreDB\Jobs\ThemeInstallationJob))
#10 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(105): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Modules\ThemeStoreDB\Jobs\ThemeInstallationJob))
#11 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Bus\Dispatcher.php(98): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#12 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\CallQueuedHandler.php(83): Illuminate\Bus\Dispatcher->dispatchNow(Object(Modules\ThemeStoreDB\Jobs\ThemeInstallationJob), false)
#13 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(130): Illuminate\Queue\CallQueuedHandler->Illuminate\Queue\{closure}(Object(Modules\ThemeStoreDB\Jobs\ThemeInstallationJob))
#14 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(105): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Modules\ThemeStoreDB\Jobs\ThemeInstallationJob))
#15 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\CallQueuedHandler.php(85): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#16 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\CallQueuedHandler.php(59): Illuminate\Queue\CallQueuedHandler->dispatchThroughMiddleware(Object(Illuminate\Queue\Jobs\RedisJob), Object(Modules\ThemeStoreDB\Jobs\ThemeInstallationJob))
#17 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Jobs\Job.php(88): Illuminate\Queue\CallQueuedHandler->call(Object(Illuminate\Queue\Jobs\RedisJob), Array)
#18 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Worker.php(368): Illuminate\Queue\Jobs\Job->fire()
#19 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Worker.php(314): Illuminate\Queue\Worker->process('redis', Object(Illuminate\Queue\Jobs\RedisJob), Object(Illuminate\Queue\WorkerOptions))
#20 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Worker.php(134): Illuminate\Queue\Worker->runJob(Object(Illuminate\Queue\Jobs\RedisJob), 'redis', Object(Illuminate\Queue\WorkerOptions))
#21 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Console\WorkCommand.php(112): Illuminate\Queue\Worker->daemon('redis', 'default', Object(Illuminate\Queue\WorkerOptions))
#22 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Queue\Console\WorkCommand.php(96): Illuminate\Queue\Console\WorkCommand->runWorker('redis', 'default')
#23 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(36): Illuminate\Queue\Console\WorkCommand->handle()
#24 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Util.php(37): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#25 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
#26 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#27 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Container\Container.php(590): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#28 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Console\Command.php(134): Illuminate\Container\Container->call(Array)
#29 E:\wwwroot\object\vendor\symfony\console\Command\Command.php(255): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#30 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Console\Command.php(121): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#31 E:\wwwroot\object\vendor\symfony\console\Application.php(1009): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#32 E:\wwwroot\object\vendor\symfony\console\Application.php(273): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Queue\Console\WorkCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#33 E:\wwwroot\object\vendor\symfony\console\Application.php(149): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#34 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Console\Application.php(93): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#35 E:\wwwroot\object\vendor\laravel\framework\src\Illuminate\Foundation\Console\Kernel.php(131): Illuminate\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#36 E:\wwwroot\object\artisan(37): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#37 {main}


7、在尝试关闭资源之前检查资源是否仍然是资源:


        // 检测变量是否为资源类型,如果是,则关闭
        if (is_resource($resource)) {
            fclose($resource);
        }


8、最后自行在 Windows 10 中生成一个 zip 文件,再次测试下载,下载成功。如图2
最后自行在 Windows 10 中生成一个 zip 文件,再次测试下载,下载成功

图2

]]>
https://www.shuijingwanwq.com/2022/05/31/6475/feed/ 0
CakePHP 2.x 版本的部署,Warning: SplFileInfo::openFile(/app/tmp/cache/persistent/myapp_cake_core_file_map): failed to open stream: Permission denied in /lib/Cake/Cache/Engine/FileEngine.php on line 356 https://www.shuijingwanwq.com/2021/04/12/4850/ https://www.shuijingwanwq.com/2021/04/12/4850/#respond Mon, 12 Apr 2021 02:17:24 +0000 https://www.shuijingwanwq.com/?p=4850 Post Views: 97 1、CakePHP 2.x 版本的部署,Warning: SplFileInfo::openFile(/mcloud/creditshop_back/creditshopback/app/tmp/cache/persistent/myapp_cake_core_file_map): failed to open stream: Permission denied in /mcloud/creditshop_back/creditshopback/lib/Cake/Cache/Engine/FileEngine.php on line 356。如图1
CakePHP 2.x 版本的部署,Warning: SplFileInfo::openFile(/mcloud/creditshop_back/creditshopback/app/tmp/cache/persistent/myapp_cake_core_file_map): failed to open stream: Permission denied in /mcloud/creditshop_back/creditshopback/lib/Cake/Cache/Engine/FileEngine.php on line 356。

图1

2、进入目录:/mcloud/creditshop_back/creditshopback/app/tmp/cache/persistent,查看所属用户与用户组,皆为:root。如图2
进入目录:/mcloud/creditshop_back/creditshopback/app/tmp/cache/persistent,查看所属用户与用户组,皆为:root。

图2



[root@back-86667bcfcb-p95js /]# cd /mcloud/creditshop_back/creditshopback/app/tmp/cache/persistent
[root@back-86667bcfcb-p95js persistent]# ls -l
total 20
-rw-rw-r-- 1 root  root    43 Apr  7 20:15 myapp_cake_core_cake_console_zho
-rw-rw-r-- 1 root  root    43 Apr  7 20:15 myapp_cake_core_cake_dev_zho
-rw-rw-r-- 1 nginx nginx  225 Apr  8 10:06 myapp_cake_core_default_zho
-rw-rw-r-- 1 root  root  3239 Apr  7 20:15 myapp_cake_core_file_map
-rw-rw-r-- 1 nginx nginx  633 Apr  8 10:06 myapp_cake_core_method_cache
[root@back-86667bcfcb-p95js persistent]# 


3、参考网址:https://book.cakephp.org/2/zh/installation.html 。设置访问权限。app/tmp 目录及其子目录必须同时能够被 web 服务器和命令行用户写入。


HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1`
setfacl -R -m u:${HTTPDUSER}:rwx app/tmp
setfacl -R -d -m u:${HTTPDUSER}:rwx app/tmp


4、编辑 Dockerfile。确保在 CakePHP 安装中 app/tmp 目录及其全部子目录可以被 web 服务器用户 写入。


    chown -R 775 /mcloud/creditshop_back/creditshopback/app/tmp/ && \




    cd /mcloud/creditshop_back/creditshopback &&\
    HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1` &&\
    setfacl -R -m u:${HTTPDUSER}:rwx app/tmp &&\
    setfacl -R -d -m u:${HTTPDUSER}:rwx app/tmp &&\


5、升级后,Nginx 用户写入成功,访问正常。  ]]>
https://www.shuijingwanwq.com/2021/04/12/4850/feed/ 0
Nginx + php-fpm 在 Windows 10、CentOS 8 下的串行、并行支持与否的分析测试与解决 https://www.shuijingwanwq.com/2020/03/26/4043/ https://www.shuijingwanwq.com/2020/03/26/4043/#respond Thu, 26 Mar 2020 08:06:18 +0000 https://www.shuijingwanwq.com/?p=4043 Post Views: 124 1、Nginx + php-fpm 在 Windows 10 下的情况表现,当在一个请求(http://api.channel-pub-api.localhost)中 CURL 另一个请求(http://api.channel-pub-api.localhost)时,报错:fopen(http://api.channel-pub-api.localhost/qq/v1/articles/standard?group_id=015ce30b116ce86058fa6ab4fea4ac63): failed to open stream: HTTP request failed! 。如图1
Nginx + php-fpm 在 Windows 10 下的情况表现,当在一个请求(http://api.channel-pub-api.localhost)中 CURL 另一个请求(http://api.channel-pub-api.localhost)时,报错:fopen(http://api.channel-pub-api.localhost/qq/v1/articles/standard?group_id=015ce30b116ce86058fa6ab4fea4ac63): failed to open stream: HTTP request failed! 。

图1



{
    "name": "HTTP Client Exception",
    "message": "fopen(http://api.channel-pub-api.localhost/qq/v1/articles/standard?group_id=015ce30b116ce86058fa6ab4fea4ac63): failed to open stream: HTTP request failed! ",
    "code": 2,
    "type": "yii\\httpclient\\Exception",
    "file": "E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2-httpclient\\src\\StreamTransport.php",
    "line": 68,
    "stack-trace": [
        "#0 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2-httpclient\\src\\Transport.php(41): yii\\httpclient\\StreamTransport->send(Object(yii\\httpclient\\Request))",
        "#1 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2-httpclient\\src\\Client.php(259): yii\\httpclient\\Transport->batchSend(Array)",
        "#2 E:\\wwwroot\\channel-pub-api-feature-task-group\\common\\logics\\http\\channel_pub_api\\Article.php(55): yii\\httpclient\\Client->batchSend(Array)",
        "#3 E:\\wwwroot\\channel-pub-api-feature-task-group\\common\\services\\TaskGroupService.php(117): common\\logics\\http\\channel_pub_api\\Article->batchPostArticlesStandard('015ce30b116ce86...', Array)",
        "#4 E:\\wwwroot\\channel-pub-api-feature-task-group\\api\\filters\\TaskGroupFilter.php(45): common\\services\\TaskGroupService::createMultipleSync(Array)",
        "#5 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2\\base\\ActionFilter.php(92): api\\filters\\TaskGroupFilter->afterAction(Object(api\\rests\\task_group\\CreateAction), Array)",
        "#6 [internal function]: yii\\base\\ActionFilter->afterFilter(Object(yii\\base\\ActionEvent))",
        "#7 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2\\base\\Component.php(627): call_user_func(Array, Object(yii\\base\\ActionEvent))",
        "#8 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2\\base\\Controller.php(305): yii\\base\\Component->trigger('afterAction', Object(yii\\base\\ActionEvent))",
        "#9 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2\\rest\\Controller.php(76): yii\\base\\Controller->afterAction(Object(api\\rests\\task_group\\CreateAction), Array)",
        "#10 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2\\base\\Controller.php(159): yii\\rest\\Controller->afterAction(Object(api\\rests\\task_group\\CreateAction), Array)",
        "#11 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2\\base\\Module.php(528): yii\\base\\Controller->runAction('create', Array)",
        "#12 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2\\web\\Application.php(103): yii\\base\\Module->runAction('v1/task-group/c...', Array)",
        "#13 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2\\base\\Application.php(386): yii\\web\\Application->handleRequest(Object(yii\\web\\Request))",
        "#14 E:\\wwwroot\\channel-pub-api-feature-task-group\\api\\web\\index.php(17): yii\\base\\Application->run()",
        "#15 {main}"
    ],
    "previous": {
        "name": "PHP Warning",
        "message": "fopen(http://api.channel-pub-api.localhost/qq/v1/articles/standard?group_id=015ce30b116ce86058fa6ab4fea4ac63): failed to open stream: HTTP request failed! ",
        "code": 2,
        "type": "yii\\base\\ErrorException",
        "file": "E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2-httpclient\\src\\StreamTransport.php",
        "line": 61,
        "stack-trace": [
            "#0 [internal function]: yii\\base\\ErrorHandler->handleError(2, 'fopen(http://ap...', 'E:\\\\wwwroot\\\\chan...', 61, Array)",
            "#1 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2-httpclient\\src\\StreamTransport.php(61): fopen('http://api.chan...', 'rb', false, Resource id #205)",
            "#2 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2-httpclient\\src\\Transport.php(41): yii\\httpclient\\StreamTransport->send(Object(yii\\httpclient\\Request))",
            "#3 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2-httpclient\\src\\Client.php(259): yii\\httpclient\\Transport->batchSend(Array)",
            "#4 E:\\wwwroot\\channel-pub-api-feature-task-group\\common\\logics\\http\\channel_pub_api\\Article.php(55): yii\\httpclient\\Client->batchSend(Array)",
            "#5 E:\\wwwroot\\channel-pub-api-feature-task-group\\common\\services\\TaskGroupService.php(117): common\\logics\\http\\channel_pub_api\\Article->batchPostArticlesStandard('015ce30b116ce86...', Array)",
            "#6 E:\\wwwroot\\channel-pub-api-feature-task-group\\api\\filters\\TaskGroupFilter.php(45): common\\services\\TaskGroupService::createMultipleSync(Array)",
            "#7 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2\\base\\ActionFilter.php(92): api\\filters\\TaskGroupFilter->afterAction(Object(api\\rests\\task_group\\CreateAction), Array)",
            "#8 [internal function]: yii\\base\\ActionFilter->afterFilter(Object(yii\\base\\ActionEvent))",
            "#9 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2\\base\\Component.php(627): call_user_func(Array, Object(yii\\base\\ActionEvent))",
            "#10 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2\\base\\Controller.php(305): yii\\base\\Component->trigger('afterAction', Object(yii\\base\\ActionEvent))",
            "#11 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2\\rest\\Controller.php(76): yii\\base\\Controller->afterAction(Object(api\\rests\\task_group\\CreateAction), Array)",
            "#12 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2\\base\\Controller.php(159): yii\\rest\\Controller->afterAction(Object(api\\rests\\task_group\\CreateAction), Array)",
            "#13 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2\\base\\Module.php(528): yii\\base\\Controller->runAction('create', Array)",
            "#14 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2\\web\\Application.php(103): yii\\base\\Module->runAction('v1/task-group/c...', Array)",
            "#15 E:\\wwwroot\\channel-pub-api-feature-task-group\\vendor\\yiisoft\\yii2\\base\\Application.php(386): yii\\web\\Application->handleRequest(Object(yii\\web\\Request))",
            "#16 E:\\wwwroot\\channel-pub-api-feature-task-group\\api\\web\\index.php(17): yii\\base\\Application->run()",
            "#17 {main}"
        ]
    }
}


2、编辑 Nginx 配置文件,复制 server:API 为 server:LOCALHOST API。调整 listen 81、server_name localhost、fastcgi_pass 127.0.0.1:9001。总计 3 项配置值。如图2、图3
编辑 Nginx 配置文件,复制 server:API 为 server:LOCALHOST API。调整 listen 81、server_name localhost

图2

 
编辑 Nginx 配置文件,复制 server:API 为 server:LOCALHOST API。调整 fastcgi_pass 127.0.0.1:9001

图3



## FRONTEND ##
server {
    charset utf-8;

	client_max_body_size 200m;
	client_body_buffer_size 1024k;

	fastcgi_read_timeout 180s;

    listen 80; ## listen for ipv4
    #listen [::]:80 default_server ipv6only=on; ## listen for ipv6

    server_name www.channel-pub-api.localhost www.channel-pub-api-localhost.chinamcloud.cn auth.channel-pub.wjdev.chinamcloud.cn;
    root        E:/wwwroot/channel-pub-api-feature-task-group/frontend/web;
    index       index.php;

    access_log  logs/www.channel-pub-api.localhost.access.log;
    error_log   logs/www.channel-pub-api.localhost.error.log;

	location / {
		# Redirect everything that isn't a real file to index.php
		try_files $uri $uri/ /index.php$is_args$args;
	}

	# uncomment to avoid processing of calls to non-existing static files by Yii
	#location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
	#    try_files $uri =404;
	#}
	#error_page 404 /404.html;

	# deny accessing php files for the /assets directory
	location ~ ^/assets/.*\.php$ {
		deny all;
	}

	location ~ \.php$ {
		include fastcgi_params;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		fastcgi_pass 127.0.0.1:9000;
		#fastcgi_pass unix:/var/run/php5-fpm.sock;
		try_files $uri =404;
	}

	location ~* /\. {
		deny all;
	}
}

## API ##
server {
    charset utf-8;

	client_max_body_size 200m;
	client_body_buffer_size 1024k;

	fastcgi_read_timeout 180s;

    listen 80; ## listen for ipv4
    #listen [::]:80 default_server ipv6only=on; ## listen for ipv6

    server_name api.channel-pub-api.localhost api.channel-pub-api-localhost.chinamcloud.cn;

    root E:/wwwroot/channel-pub-api-feature-task-group;
    index index.php;

    access_log  logs/api.channel-pub-api.localhost.access.log;
    error_log   logs/api.channel-pub-api.localhost.error.log;

	location / {
        root E:/wwwroot/channel-pub-api-feature-task-group/api/web;
        try_files $uri $uri/ /api/web/index.php$is_args$args;

        # omit static files logging, and if they don't exist, avoid processing by Yii (uncomment if necessary)
        #location ~ ^/.+\.(css|js|ico|png|jpe?g|gif|svg|ttf|mp4|mov|swf|pdf|zip|rar)$ {
        #    log_not_found off;
        #    access_log off;
        #    try_files $uri =404;
        #}

        location ~ ^/assets/.+\.php(/|$) {
            deny all;
        }
    }

    location /baijia {
        alias E:/wwwroot/channel-pub-api-feature-task-group/baijia/web/;

        # redirect to the URL without a trailing slash (uncomment if necessary)
        #location = /baijia/ {
        #    return 301 /baijia;
        #}

        # prevent the directory redirect to the URL with a trailing slash
        location = /baijia {
            # if your location is "/baijia", try use "/baijia/baijia/web/index.php$is_args$args"
            # bug ticket: https://trac.nginx.org/nginx/ticket/97
            try_files $uri /baijia/baijia/web/index.php$is_args$args;
        }

        # if your location is "/baijia", try use "/baijia/baijia/web/index.php$is_args$args"
        # bug ticket: https://trac.nginx.org/nginx/ticket/97
        try_files $uri $uri/ /baijia/baijia/web/index.php$is_args$args;

        # omit static files logging, and if they don't exist, avoid processing by Yii (uncomment if necessary)
        #location ~ ^/baijia/.+\.(css|js|ico|png|jpe?g|gif|svg|ttf|mp4|mov|swf|pdf|zip|rar)$ {
        #    log_not_found off;
        #    access_log off;
        #    try_files $uri =404;
        #}

        location ~ ^/baijia/assets/.+\.php(/|$) {
            deny all;
        }
    }

	location /customize {
        alias E:/wwwroot/channel-pub-api-feature-task-group/customize/web/;

        # redirect to the URL without a trailing slash (uncomment if necessary)
        #location = /customize/ {
        #    return 301 /customize;
        #}

        # prevent the directory redirect to the URL with a trailing slash
        location = /customize {
            # if your location is "/customize", try use "/customize/customize/web/index.php$is_args$args"
            # bug ticket: https://trac.nginx.org/nginx/ticket/97
            try_files $uri /customize/customize/web/index.php$is_args$args;
        }

        # if your location is "/customize", try use "/customize/customize/web/index.php$is_args$args"
        # bug ticket: https://trac.nginx.org/nginx/ticket/97
        try_files $uri $uri/ /customize/customize/web/index.php$is_args$args;

        # omit static files logging, and if they don't exist, avoid processing by Yii (uncomment if necessary)
        #location ~ ^/customize/.+\.(css|js|ico|png|jpe?g|gif|svg|ttf|mp4|mov|swf|pdf|zip|rar)$ {
        #    log_not_found off;
        #    access_log off;
        #    try_files $uri =404;
        #}

        location ~ ^/customize/assets/.+\.php(/|$) {
            deny all;
        }
    }

	location /netease {
        alias E:/wwwroot/channel-pub-api-feature-task-group/netease/web/;

        # redirect to the URL without a trailing slash (uncomment if necessary)
        #location = /netease/ {
        #    return 301 /netease;
        #}

        # prevent the directory redirect to the URL with a trailing slash
        location = /netease {
            # if your location is "/netease", try use "/netease/netease/web/index.php$is_args$args"
            # bug ticket: https://trac.nginx.org/nginx/ticket/97
            try_files $uri /netease/netease/web/index.php$is_args$args;
        }

        # if your location is "/netease", try use "/netease/netease/web/index.php$is_args$args"
        # bug ticket: https://trac.nginx.org/nginx/ticket/97
        try_files $uri $uri/ /netease/netease/web/index.php$is_args$args;

        # omit static files logging, and if they don't exist, avoid processing by Yii (uncomment if necessary)
        #location ~ ^/netease/.+\.(css|js|ico|png|jpe?g|gif|svg|ttf|mp4|mov|swf|pdf|zip|rar)$ {
        #    log_not_found off;
        #    access_log off;
        #    try_files $uri =404;
        #}

        location ~ ^/netease/assets/.+\.php(/|$) {
            deny all;
        }
    }

    location /qq {
        alias E:/wwwroot/channel-pub-api-feature-task-group/qq/web/;

        # redirect to the URL without a trailing slash (uncomment if necessary)
        #location = /qq/ {
        #    return 301 /qq;
        #}

        # prevent the directory redirect to the URL with a trailing slash
        location = /qq {
            # if your location is "/qq", try use "/qq/qq/web/index.php$is_args$args"
            # bug ticket: https://trac.nginx.org/nginx/ticket/97
            try_files $uri /qq/qq/web/index.php$is_args$args;
        }

        # if your location is "/qq", try use "/qq/qq/web/index.php$is_args$args"
        # bug ticket: https://trac.nginx.org/nginx/ticket/97
        try_files $uri $uri/ /qq/qq/web/index.php$is_args$args;

        # omit static files logging, and if they don't exist, avoid processing by Yii (uncomment if necessary)
        #location ~ ^/qq/.+\.(css|js|ico|png|jpe?g|gif|svg|ttf|mp4|mov|swf|pdf|zip|rar)$ {
        #    log_not_found off;
        #    access_log off;
        #    try_files $uri =404;
        #}

        location ~ ^/qq/assets/.+\.php(/|$) {
            deny all;
        }
    }

	location /weibo {
        alias E:/wwwroot/channel-pub-api-feature-task-group/weibo/web/;

        # redirect to the URL without a trailing slash (uncomment if necessary)
        #location = /weibo/ {
        #    return 301 /weibo;
        #}

        # prevent the directory redirect to the URL with a trailing slash
        location = /weibo {
            # if your location is "/weibo", try use "/weibo/weibo/web/index.php$is_args$args"
            # bug ticket: https://trac.nginx.org/nginx/ticket/97
            try_files $uri /weibo/weibo/web/index.php$is_args$args;
        }

        # if your location is "/weibo", try use "/weibo/weibo/web/index.php$is_args$args"
        # bug ticket: https://trac.nginx.org/nginx/ticket/97
        try_files $uri $uri/ /weibo/weibo/web/index.php$is_args$args;

        # omit static files logging, and if they don't exist, avoid processing by Yii (uncomment if necessary)
        #location ~ ^/weibo/.+\.(css|js|ico|png|jpe?g|gif|svg|ttf|mp4|mov|swf|pdf|zip|rar)$ {
        #    log_not_found off;
        #    access_log off;
        #    try_files $uri =404;
        #}

        location ~ ^/weibo/assets/.+\.php(/|$) {
            deny all;
        }
    }

	location /wx {
        alias E:/wwwroot/channel-pub-api-feature-task-group/wx/web/;

        # redirect to the URL without a trailing slash (uncomment if necessary)
        #location = /wx/ {
        #    return 301 /wx;
        #}

        # prevent the directory redirect to the URL with a trailing slash
        location = /wx {
            # if your location is "/wx", try use "/wx/wx/web/index.php$is_args$args"
            # bug ticket: https://trac.nginx.org/nginx/ticket/97
            try_files $uri /wx/wx/web/index.php$is_args$args;
        }

        # if your location is "/wx", try use "/wx/wx/web/index.php$is_args$args"
        # bug ticket: https://trac.nginx.org/nginx/ticket/97
        try_files $uri $uri/ /wx/wx/web/index.php$is_args$args;

        # omit static files logging, and if they don't exist, avoid processing by Yii (uncomment if necessary)
        #location ~ ^/wx/.+\.(css|js|ico|png|jpe?g|gif|svg|ttf|mp4|mov|swf|pdf|zip|rar)$ {
        #    log_not_found off;
        #    access_log off;
        #    try_files $uri =404;
        #}

        location ~ ^/wx/assets/.+\.php(/|$) {
            deny all;
        }
    }

	location ~ ^/.+\.php(/|$) {
        rewrite (?!^/((api|baijia|customize|netease|qq|weibo|wx)/web|baijia|customize|netease|qq|weibo|wx))^ /api/web$uri break;
		rewrite (?!^/baijia/web)^/baijia(/.+)$ /baijia/web$1 break;
		rewrite (?!^/customize/web)^/customize(/.+)$ /customize/web$1 break;
        rewrite (?!^/netease/web)^/netease(/.+)$ /netease/web$1 break;
		rewrite (?!^/qq/web)^/qq(/.+)$ /qq/web$1 break;
		rewrite (?!^/weibo/web)^/weibo(/.+)$ /weibo/web$1 break;
		rewrite (?!^/wx/web)^/wx(/.+)$ /wx/web$1 break;

		include fastcgi_params;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		fastcgi_pass 127.0.0.1:9000;
		#fastcgi_pass unix:/var/run/php5-fpm.sock;
        try_files $fastcgi_script_name =404;
    }

    location ~ /\. {
        deny all;
    }
}

## LOCALHOST API ##
server {
    charset utf-8;

	client_max_body_size 200m;
	client_body_buffer_size 1024k;

	fastcgi_read_timeout 180s;

    listen 81; ## listen for ipv4
    #listen [::]:80 default_server ipv6only=on; ## listen for ipv6

    server_name localhost;

    root E:/wwwroot/channel-pub-api-feature-task-group;
    index index.php;

    access_log  logs/localhost.access.log;
    error_log   logs/localhost.error.log;

	location / {
        root E:/wwwroot/channel-pub-api-feature-task-group/api/web;
        try_files $uri $uri/ /api/web/index.php$is_args$args;

        # omit static files logging, and if they don't exist, avoid processing by Yii (uncomment if necessary)
        #location ~ ^/.+\.(css|js|ico|png|jpe?g|gif|svg|ttf|mp4|mov|swf|pdf|zip|rar)$ {
        #    log_not_found off;
        #    access_log off;
        #    try_files $uri =404;
        #}

        location ~ ^/assets/.+\.php(/|$) {
            deny all;
        }
    }

    location /baijia {
        alias E:/wwwroot/channel-pub-api-feature-task-group/baijia/web/;

        # redirect to the URL without a trailing slash (uncomment if necessary)
        #location = /baijia/ {
        #    return 301 /baijia;
        #}

        # prevent the directory redirect to the URL with a trailing slash
        location = /baijia {
            # if your location is "/baijia", try use "/baijia/baijia/web/index.php$is_args$args"
            # bug ticket: https://trac.nginx.org/nginx/ticket/97
            try_files $uri /baijia/baijia/web/index.php$is_args$args;
        }

        # if your location is "/baijia", try use "/baijia/baijia/web/index.php$is_args$args"
        # bug ticket: https://trac.nginx.org/nginx/ticket/97
        try_files $uri $uri/ /baijia/baijia/web/index.php$is_args$args;

        # omit static files logging, and if they don't exist, avoid processing by Yii (uncomment if necessary)
        #location ~ ^/baijia/.+\.(css|js|ico|png|jpe?g|gif|svg|ttf|mp4|mov|swf|pdf|zip|rar)$ {
        #    log_not_found off;
        #    access_log off;
        #    try_files $uri =404;
        #}

        location ~ ^/baijia/assets/.+\.php(/|$) {
            deny all;
        }
    }

	location /customize {
        alias E:/wwwroot/channel-pub-api-feature-task-group/customize/web/;

        # redirect to the URL without a trailing slash (uncomment if necessary)
        #location = /customize/ {
        #    return 301 /customize;
        #}

        # prevent the directory redirect to the URL with a trailing slash
        location = /customize {
            # if your location is "/customize", try use "/customize/customize/web/index.php$is_args$args"
            # bug ticket: https://trac.nginx.org/nginx/ticket/97
            try_files $uri /customize/customize/web/index.php$is_args$args;
        }

        # if your location is "/customize", try use "/customize/customize/web/index.php$is_args$args"
        # bug ticket: https://trac.nginx.org/nginx/ticket/97
        try_files $uri $uri/ /customize/customize/web/index.php$is_args$args;

        # omit static files logging, and if they don't exist, avoid processing by Yii (uncomment if necessary)
        #location ~ ^/customize/.+\.(css|js|ico|png|jpe?g|gif|svg|ttf|mp4|mov|swf|pdf|zip|rar)$ {
        #    log_not_found off;
        #    access_log off;
        #    try_files $uri =404;
        #}

        location ~ ^/customize/assets/.+\.php(/|$) {
            deny all;
        }
    }

	location /netease {
        alias E:/wwwroot/channel-pub-api-feature-task-group/netease/web/;

        # redirect to the URL without a trailing slash (uncomment if necessary)
        #location = /netease/ {
        #    return 301 /netease;
        #}

        # prevent the directory redirect to the URL with a trailing slash
        location = /netease {
            # if your location is "/netease", try use "/netease/netease/web/index.php$is_args$args"
            # bug ticket: https://trac.nginx.org/nginx/ticket/97
            try_files $uri /netease/netease/web/index.php$is_args$args;
        }

        # if your location is "/netease", try use "/netease/netease/web/index.php$is_args$args"
        # bug ticket: https://trac.nginx.org/nginx/ticket/97
        try_files $uri $uri/ /netease/netease/web/index.php$is_args$args;

        # omit static files logging, and if they don't exist, avoid processing by Yii (uncomment if necessary)
        #location ~ ^/netease/.+\.(css|js|ico|png|jpe?g|gif|svg|ttf|mp4|mov|swf|pdf|zip|rar)$ {
        #    log_not_found off;
        #    access_log off;
        #    try_files $uri =404;
        #}

        location ~ ^/netease/assets/.+\.php(/|$) {
            deny all;
        }
    }

    location /qq {
        alias E:/wwwroot/channel-pub-api-feature-task-group/qq/web/;

        # redirect to the URL without a trailing slash (uncomment if necessary)
        #location = /qq/ {
        #    return 301 /qq;
        #}

        # prevent the directory redirect to the URL with a trailing slash
        location = /qq {
            # if your location is "/qq", try use "/qq/qq/web/index.php$is_args$args"
            # bug ticket: https://trac.nginx.org/nginx/ticket/97
            try_files $uri /qq/qq/web/index.php$is_args$args;
        }

        # if your location is "/qq", try use "/qq/qq/web/index.php$is_args$args"
        # bug ticket: https://trac.nginx.org/nginx/ticket/97
        try_files $uri $uri/ /qq/qq/web/index.php$is_args$args;

        # omit static files logging, and if they don't exist, avoid processing by Yii (uncomment if necessary)
        #location ~ ^/qq/.+\.(css|js|ico|png|jpe?g|gif|svg|ttf|mp4|mov|swf|pdf|zip|rar)$ {
        #    log_not_found off;
        #    access_log off;
        #    try_files $uri =404;
        #}

        location ~ ^/qq/assets/.+\.php(/|$) {
            deny all;
        }
    }

	location /weibo {
        alias E:/wwwroot/channel-pub-api-feature-task-group/weibo/web/;

        # redirect to the URL without a trailing slash (uncomment if necessary)
        #location = /weibo/ {
        #    return 301 /weibo;
        #}

        # prevent the directory redirect to the URL with a trailing slash
        location = /weibo {
            # if your location is "/weibo", try use "/weibo/weibo/web/index.php$is_args$args"
            # bug ticket: https://trac.nginx.org/nginx/ticket/97
            try_files $uri /weibo/weibo/web/index.php$is_args$args;
        }

        # if your location is "/weibo", try use "/weibo/weibo/web/index.php$is_args$args"
        # bug ticket: https://trac.nginx.org/nginx/ticket/97
        try_files $uri $uri/ /weibo/weibo/web/index.php$is_args$args;

        # omit static files logging, and if they don't exist, avoid processing by Yii (uncomment if necessary)
        #location ~ ^/weibo/.+\.(css|js|ico|png|jpe?g|gif|svg|ttf|mp4|mov|swf|pdf|zip|rar)$ {
        #    log_not_found off;
        #    access_log off;
        #    try_files $uri =404;
        #}

        location ~ ^/weibo/assets/.+\.php(/|$) {
            deny all;
        }
    }

	location /wx {
        alias E:/wwwroot/channel-pub-api-feature-task-group/wx/web/;

        # redirect to the URL without a trailing slash (uncomment if necessary)
        #location = /wx/ {
        #    return 301 /wx;
        #}

        # prevent the directory redirect to the URL with a trailing slash
        location = /wx {
            # if your location is "/wx", try use "/wx/wx/web/index.php$is_args$args"
            # bug ticket: https://trac.nginx.org/nginx/ticket/97
            try_files $uri /wx/wx/web/index.php$is_args$args;
        }

        # if your location is "/wx", try use "/wx/wx/web/index.php$is_args$args"
        # bug ticket: https://trac.nginx.org/nginx/ticket/97
        try_files $uri $uri/ /wx/wx/web/index.php$is_args$args;

        # omit static files logging, and if they don't exist, avoid processing by Yii (uncomment if necessary)
        #location ~ ^/wx/.+\.(css|js|ico|png|jpe?g|gif|svg|ttf|mp4|mov|swf|pdf|zip|rar)$ {
        #    log_not_found off;
        #    access_log off;
        #    try_files $uri =404;
        #}

        location ~ ^/wx/assets/.+\.php(/|$) {
            deny all;
        }
    }

	location ~ ^/.+\.php(/|$) {
        rewrite (?!^/((api|baijia|customize|netease|qq|weibo|wx)/web|baijia|customize|netease|qq|weibo|wx))^ /api/web$uri break;
		rewrite (?!^/baijia/web)^/baijia(/.+)$ /baijia/web$1 break;
		rewrite (?!^/customize/web)^/customize(/.+)$ /customize/web$1 break;
        rewrite (?!^/netease/web)^/netease(/.+)$ /netease/web$1 break;
		rewrite (?!^/qq/web)^/qq(/.+)$ /qq/web$1 break;
		rewrite (?!^/weibo/web)^/weibo(/.+)$ /weibo/web$1 break;
		rewrite (?!^/wx/web)^/wx(/.+)$ /wx/web$1 break;

		include fastcgi_params;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		fastcgi_pass 127.0.0.1:9001;
		#fastcgi_pass unix:/var/run/php5-fpm.sock;
        try_files $fastcgi_script_name =404;
    }

    location ~ /\. {
        deny all;
    }
}

## MISC ##

### WWW Redirect ###
server {
    listen       80;
    server_name  channel-pub-api.localhost;
    return       301 http://www.channel-pub-api.localhost$request_uri;
}



3、新开 PowerShell 窗口,执行 php-cgi.exe -b 127.0.0.1:9001-c C:/php-7.2.14/php.ini,如图4
新开 PowerShell 窗口,执行 php-cgi.exe -b 127.0.0.1:9001-c C:/php-7.2.14/php.ini

图4

4、Nginx + php-fpm 在 Windows 10 下的情况表现,当在一个请求(http://api.channel-pub-api.localhost)中 CURL 另一个请求(http://localhost:81)时,响应成功,如图5
Nginx + php-fpm 在 Windows 10 下的情况表现,当在一个请求(http://api.channel-pub-api.localhost)中 CURL 另一个请求(http://localhost:81)时,响应成功

图5

5、查看具体的请求发起时间节点,虽然是并行请求,但是实际表现上却是串行的。即一个请求完毕后,再执行下一个请求。其总体响应时间长度为:21.75s。如图6
查看具体的请求发起时间节点,虽然是并行请求,但是实际表现上却是串行的。即一个请求完毕后,再执行下一个请求。其总体响应时间长度为:21.75s。

图6



10:37:26.340	info	yii\httpclient\StreamTransport::send	POST http://localhost:81/baijia/v1/articles/standard?group_id=015ce30b116ce86058fa6ab4fea4ac62
Content-Type: application/json; charset=UTF-8

10:37:29.461	info	yii\httpclient\StreamTransport::send	POST http://localhost:81/netease/v1/articles/standard?group_id=015ce30b116ce86058fa6ab4fea4ac62
Content-Type: application/json; charset=UTF-8

10:37:32.732	info	yii\httpclient\StreamTransport::send	POST http://localhost:81/weibo/v1/articles/toutiao?group_id=015ce30b116ce86058fa6ab4fea4ac62
Content-Type: application/json; charset=UTF-8

10:37:35.757	info	yii\httpclient\StreamTransport::send	POST http://localhost:81/qq/v1/articles/standard?group_id=015ce30b116ce86058fa6ab4fea4ac62
Content-Type: application/json; charset=UTF-8

10:37:38.533	info	yii\httpclient\StreamTransport::send	POST http://localhost:81/qq/v1/articles/standard?group_id=015ce30b116ce86058fa6ab4fea4ac62
Content-Type: application/json; charset=UTF-8

10:37:41.132	info	yii\httpclient\StreamTransport::send	POST http://localhost:81/wx/v1/wx-articles/article?group_id=015ce30b116ce86058fa6ab4fea4ac62
Content-Type: application/json; charset=UTF-8

10:37:44.207	info	yii\httpclient\StreamTransport::send	POST http://localhost:81/customize/v1/articles/standard?group_id=015ce30b116ce86058fa6ab4fea4ac62
Content-Type: application/json; charset=UTF-8


6、决定分析测试 Nginx + php-fpm 在 Windows 10 下的串行表现。新建 phpinfo.php(延时 30 秒写入日志)、phpinfo1.php(延时 5 秒写入日志),在浏览器中先打开 phpinfo.php、然后再迅速打开 phpinfo1.php,间隔时间约为 1 秒左右。 phpinfo.php
<pre class="wp-block-syntaxhighlighter-code">

<?php
sleep(30);
file_put_contents('E:/wwwroot/channel-pub-api/console/runtime/logs/sleep-0-' . time() . '.txt', time());
phpinfo();
?>

</pre>
phpinfo1.php
<pre class="wp-block-syntaxhighlighter-code">

<?php
sleep(5);
file_put_contents('E:/wwwroot/channel-pub-api/console/runtime/logs/sleep-1-' . time() . '.txt', time());
phpinfo();
?>

</pre>
7、在打开 phpinfo.php 后,其大约加载了 30 秒左右的时间长度。在打开 phpinfo1.php 后,其大约加载了 35 秒左右的时间长度(如果支持并行,则加载时间预计为 5 秒左右。如果不支持并行,仅支持串行,则加载时间预计为 35 秒左右,其中 30 秒为等待 phpinfo.php 运行结束的时间,只有当 phpinfo.php 运行结束后,9001 端口才可用,5 秒为 phpinfo1.php 自身运行的时间)。如图7
在打开 phpinfo.php 后,其大约加载了 30 秒左右的时间长度。在打开 phpinfo1.php 后,其大约加载了 35 秒左右的时间长度(如果支持并行,则加载时间预计为 5 秒左右。如果不支持并行,仅支持串行,则加载时间预计为 35 秒左右,其中 30 秒为等待 phpinfo.php 运行结束的时间,只有当 phpinfo.php 运行结束后,9001 端口才可用,5 秒为 phpinfo1.php 自身运行的时间)。

图7

8、分别查看生成的日志文件的创建时间。可以确定 phpinfo1.php 的日志文件的创建时间晚于 phpinfo.php 的日志文件的创建时间,精确为 5 秒钟。由此可以确定,Nginx + php-fpm 在 Windows 10 下,是仅支持串行请求的。如图8
分别查看生成的日志文件的创建时间。可以确定 phpinfo1.php 的日志文件的创建时间晚于 phpinfo.php 的日志文件的创建时间,精确为 5 秒钟。由此可以确定,Nginx + php-fpm 在 Windows 10 下,是仅支持串行请求的。

图8



sleep-0-1585200354.txt
sleep-1-1585200359.txt


9、开发环境的部署方案为:CentOS + Nginx + php-fpm。重复第 6、7、8 步骤。分别查看生成的日志文件的创建时间。可以确定 phpinfo1.php 的日志文件的创建时间早于 phpinfo.php 的日志文件的创建时间,精确为 23 秒钟,虽然其晚于 phpinfo.php 开始运行。由此可以确定,Nginx + php-fpm 在 CentOS 7 下,是支持并行请求的。如图9
开发环境的部署方案为:CentOS + Nginx + php-fpm。重复第 6、7、8 步骤。分别查看生成的日志文件的创建时间。可以确定 phpinfo1.php 的日志文件的创建时间早于 phpinfo.php 的日志文件的创建时间,精确为 23 秒钟,虽然其晚于 phpinfo.php 开始运行。由此可以确定,Nginx + php-fpm 在 CentOS 7 下,是支持并行请求的。

图9



sleep-0-1585202045.txt
sleep-1-1585202022.txt


10、编辑 Nginx 配置文件,修改 server_name 的值:api.channel-pub.wjdev.chinamcloud.cn localhost,以在一个请求(https://api.channel-pub.wjdev.chinamcloud.cn)中 CURL 另一个请求(http://localhost)(总计请求次数为 7),直接请求本机,以节省网络开销。其总体响应时间长度为:1956ms,2 秒左右,符合预期。如图10
编辑 Nginx 配置文件,修改 server_name 的值:api.channel-pub.wjdev.chinamcloud.cn localhost,以在一个请求(https://api.channel-pub.wjdev.chinamcloud.cn)中 CURL 另一个请求(http://localhost)(总计请求次数为 7),直接请求本机,以节省网络开销。其总体响应时间长度为:1956ms,2 秒左右,符合预期。

图10

11、直接请求本机,其并发请求数受限于 php-fpm.conf 中的 pm.max_children 值。现在默认设置为:40。子进程的数量固定为 40 个。当在一个请求(https://api.channel-pub.wjdev.chinamcloud.cn)中 CURL 另一个请求(http://localhost)的数量为 52 时,其总体响应时间长度为:6.00s。如图11
直接请求本机,其并发请求数受限于 php-fpm.conf 中的 pm.max_children 值。现在默认设置为:40。子进程的数量固定为 40 个。当在一个请求(https://api.channel-pub.wjdev.chinamcloud.cn)中 CURL 另一个请求(http://localhost)的数量为 52 时,其总体响应时间长度为:6.00s。

图11

12、当请求数量为 42 时,其总体响应时间长度为:4.73s。当请求数量为 35 时,其总体响应时间长度为:4.39s。当请求数量为 30 时,其总体响应时间长度为:3.79s。当请求数量为 25 时,其总体响应时间长度为:2.98s。当请求数量为 20 时,其总体响应时间长度为:2.85s。当请求数量为 15 时,其总体响应时间长度为:2.36s。当请求数量为 10 时,其总体响应时间长度为:2.21s。 13、在服务器上 curl,查看 php-fpm 的状态页。


[root@5b9088596e62 /]# curl http://127.0.0.1/status
pool:                 www
process manager:      static
start time:           26/Mar/2020:13:50:05 +0800
start since:          4603
accepted conn:        516
listen queue:         0
max listen queue:     0
listen queue len:     128
idle processes:       39
active processes:     1
total processes:      40
max active processes: 10
max children reached: 0
slow requests:        0


14、最后分析测试的结果: Windows + Nginx + php-fpm(串行)、CentOS + Nginx + php-fpm(并行)、MacOS + Nginx + php-fpm(并行)、MacOS + Apache(并行)。]]>
https://www.shuijingwanwq.com/2020/03/26/4043/feed/ 0
基于 Composer 安装:JamesHeinrich / getID3,提示 ( SSL:握手超时;无法启用加密;无法打开流:操作失败 ) 的解决 https://www.shuijingwanwq.com/2020/03/10/4009/ https://www.shuijingwanwq.com/2020/03/10/4009/#respond Tue, 10 Mar 2020 09:09:38 +0000 https://www.shuijingwanwq.com/?p=4009 Post Views: 105 1、getID3() 是一个 PHP 脚本,可从 MP3 和其他多媒体文件格式中提取有用的信息。打开网址:https://github.com/JamesHeinrich/getID3 2、基于 Composer 安装:JamesHeinrich / getID3。打开 PHP 软件包存储库的网址:https://packagist.org ,搜索:JamesHeinrich / getID3 ,得出搜索结果:james-heinrich/getid3,如图1
基于 Composer 安装:JamesHeinrich / getID3。打开 PHP 软件包存储库的网址:https://packagist.org ,搜索:JamesHeinrich / getID3 ,得出搜索结果:james-heinrich/getid3

图1

3、在 PowerShell 中,执行安装命令:composer require james-heinrich/getid3,提示 ( SSL:握手超时;无法启用加密;无法打开流:操作失败 ),如图2
在 PowerShell 中,执行安装命令:composer require james-heinrich/getid3,提示 ( SSL:握手超时;无法启用加密;无法打开流:操作失败 )

图2



PS E:\wwwroot\channel-pub-api> composer require james-heinrich/getid3
The "https://asset-packagist.org/packages.json" file could not be downloaded: SSL: Handshake timed out
Failed to enable crypto
failed to open stream: operation failed
https://asset-packagist.org could not be fully loaded, package information was loaded from the local cache and may be ou
t of date
Using version ^1.9 for james-heinrich/getid3
./composer.json has been updated
Loading composer repositories with package information
The "https://asset-packagist.org/packages.json" file could not be downloaded: failed to open stream: HTTP request failed
!
https://asset-packagist.org could not be fully loaded, package information was loaded from the local cache and may be ou
t of date
Updating dependencies (including require-dev)
^CTerminate batch job (Y/N)? Y


4、参考网址:https://www.shuijingwanwq.com/2019/12/28/3784/ ,在 cmd 中设置 HTTP 代理,再次执行安装命令,安装成功,如图3
参考网址:https://www.shuijingwanwq.com/2019/12/28/3784/ ,在 cmd 中设置 HTTP 代理,再次执行安装命令,安装成功

图3



E:\wwwroot>cd channel-pub-api

E:\wwwroot\channel-pub-api>set HTTP_PROXY=http://127.0.0.1:50999

E:\wwwroot\channel-pub-api>set HTTPS_PROXY=http://127.0.0.1:50999

E:\wwwroot\channel-pub-api>composer require james-heinrich/getid3
Using version ^1.9 for james-heinrich/getid3
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing james-heinrich/getid3 (v1.9.19): Downloading (100%)
james-heinrich/getid3 suggests installing ext-com_dotnet (COM extension is required when loading files larger than 2GB on Windows.)
james-heinrich/getid3 suggests installing ext-dba (DBA extension is required to use the DBA database as a cache storage.)
james-heinrich/getid3 suggests installing ext-exif (EXIF extension is required for graphic modules.)
james-heinrich/getid3 suggests installing ext-mysql (MySQL extension is required to use the MySQL database as a cache storage (deprecated in PHP 5.5, removed in PHP >= 7.0, use `ext-mysqli` instead).)
james-heinrich/getid3 suggests installing ext-rar (RAR extension is required for RAR archive module.)
james-heinrich/getid3 suggests installing ext-SimpleXML (SimpleXML extension is required to analyze RIFF/WAV/BWF audio files (also requires `ext-libxml`).)
james-heinrich/getid3 suggests installing ext-sqlite3 (SQLite3 extension is required to use the SQLite3 database as a cache storage.)
Package codeception/base is abandoned, you should avoid using it. No replacement was suggested.
Writing lock file
Generating autoload files



]]>
https://www.shuijingwanwq.com/2020/03/10/4009/feed/ 0
在 CentOS 7.6 64 位 下基于 Nginx 安装 WordPress 时,报错:HTTP ERROR 500 的分析解决 https://www.shuijingwanwq.com/2019/03/31/3213/ https://www.shuijingwanwq.com/2019/03/31/3213/#respond Sun, 31 Mar 2019 07:30:24 +0000 http://www.shuijingwanwq.com/?p=3213 Post Views: 184 1、打开网址:http://www.aaaacn.net/wp-admin/install.php,报错:HTTP ERROR 500,如图1
打开网址:http://www.aaaacn.net/wp-admin/install.php,报错:HTTP ERROR 500

图1

2、打开网址:http://www.aaaacn.net/phpinfo.php,正常运行,如图2
打开网址:http://www.aaaacn.net/phpinfo.php,正常运行

图2

3、查看 Virtualhost conf:/usr/local/nginx/conf/vhost/www.aaaacn.net.conf


	server {
	  listen 80;
	  server_name www.aaaacn.net aaaacn.net;
	  access_log /data/wwwlogs/www.aaaacn.net_nginx.log combined;
	  index index.html index.htm index.php;
	  root /data/wwwroot/www.aaaacn.net;
	  if ($host != www.aaaacn.net) {  return 301 $scheme://www.aaaacn.net$request_uri;  }
	  include /usr/local/nginx/conf/rewrite/wordpress.conf;
	  #error_page 404 /404.html;
	  #error_page 502 /502.html;
	  
	  location ~ [^/]\.php(/|$) {
		#fastcgi_pass remote_php_ip:9000;
		fastcgi_pass unix:/dev/shm/php-cgi.sock;
		fastcgi_index index.php;
		include fastcgi.conf;
	  }

	  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
		expires 30d;
		access_log off;
	  }
	  location ~ .*\.(js|css)?$ {
		expires 7d;
		access_log off;
	  }
	  location ~ /\.ht {
		deny all;
	  }
	}


4、查看 Rewrite rule:/usr/local/nginx/conf/rewrite/wordpress.conf


	location / {
	  try_files $uri $uri/ /index.php?$args;
	}
	rewrite /wp-admin$ $scheme://$host$uri/ permanent;
	location ~* ^/wp-content/uploads/.*\.php$ {
	  deny all;
	}


5、查看目录权限,发现 WordPress 目录中的文件,权限用户和用户组,一些已经不是 www,而是 root,应该是因为 WordPress 目录中的文件,是 root 用户复制所导致的,如图3
查看目录权限,发现 WordPress 目录中的文件,权限用户和用户组,一些已经不是 www,而是 root,应该是因为 WordPress 目录中的文件,是 root 用户复制所导致的

图3

6、出现文件权限问题时,依次执行下面 3 条命令,设置权限用户和用户组为 www,将整个 /data/wwwroot/ 目录重新设置,如图4
出现文件权限问题时,依次执行下面 3 条命令,设置权限用户和用户组为 www,将整个 /data/wwwroot/ 目录重新设置

图4



chown -R www.www /data/wwwroot/
find /data/wwwroot/ -type d -exec chmod 755 {} \;
find /data/wwwroot/ -type f -exec chmod 644 {} \;


7、编辑 /data/wwwroot/www.aaaacn.net/wp-config.php,设置身份认证密钥与盐,如图5
编辑 /data/wwwroot/www.aaaacn.net/wp-config.php,设置身份认证密钥与盐

图5

8、在整个 WordPress 中触发“调试”模式,编辑 /data/wwwroot/www.aaaacn.net/wp-config.php



define('WP_DEBUG', true);
define( 'WP_DEBUG_LOG', true );


9、设置是否将错误信息作为输出的一部分显示到屏幕,设置为是,编辑 /data/wwwroot/www.aaaacn.net/wp-admin/install.php,在 phpinfo 中这两项是关闭的,如图6
设置是否将错误信息作为输出的一部分显示到屏幕,设置为是,编辑 /data/wwwroot/www.aaaacn.net/wp-admin/install.php,在 phpinfo 中这两项是关闭的

图6



error_reporting(-1);
ini_set('display_errors', '1');
ini_set('log_errors', '1');


10、打开网址:http://www.aaaacn.net/wp-admin/install.php,报错:HTTP ERROR 500 的详细信息出现,如图7
打开网址:http://www.aaaacn.net/wp-admin/install.php,报错:HTTP ERROR 500 的详细信息出现

图7




Warning: require(/data/wwwroot/www.aaaacn.net/wp-includes/load.php): failed to open stream: No such file or directory in /data/wwwroot/www.aaaacn.net/wp-settings.php on line 19

Warning: require(/data/wwwroot/www.aaaacn.net/wp-includes/load.php): failed to open stream: No such file or directory in /data/wwwroot/www.aaaacn.net/wp-settings.php on line 19

Fatal error: require(): Failed opening required '/data/wwwroot/www.aaaacn.net/wp-includes/load.php' (include_path='.:/usr/local/php/lib/php') in /data/wwwroot/www.aaaacn.net/wp-settings.php on line 19


11、分析:/data/wwwroot/www.aaaacn.net/wp-includes/load.php,文件不存在,如图8
分析:/data/wwwroot/www.aaaacn.net/wp-includes/load.php,文件不存在

图8

12、决定删除 /data/wwwroot/www.aaaacn.net 中的所有文件,重新下载安装包,解压后复制至 /data/wwwroot/www.aaaacn.net,检查 load.php 已经存在,设置权限用户和用户组为 www,如图9
决定删除 /data/wwwroot/www.aaaacn.net 中的所有文件,重新下载安装包,解压后复制至  /data/wwwroot/www.aaaacn.net,检查 load.php 已经存在,设置权限用户和用户组为 www

图9



wget https://cn.wordpress.org/latest-zh_CN.tar.gz
tar -xzvf latest-zh_CN.tar.gz
cp -rf /root/wordpress/* /data/wwwroot/www.aaaacn.net
chown -R www.www /data/wwwroot/
find /data/wwwroot/ -type d -exec chmod 755 {} \;
find /data/wwwroot/ -type f -exec chmod 644 {} \;


13、打开网址:http://www.aaaacn.net/wp-admin/install.php,正常,符合预期,不确定之前为何解压后 load.php 会丢失?如图10
打开网址:http://www.aaaacn.net/wp-admin/install.php,正常,符合预期,不确定之前为何解压后 load.php 会丢失?

图10

]]>
https://www.shuijingwanwq.com/2019/03/31/3213/feed/ 0