PHP Fatal error – 永夜 https://www.shuijingwanwq.com 没有不值得去解决的问题,也没有不值得去学习的技术! Sat, 30 May 2026 10:32:12 +0000 zh-Hans hourly 1 https://wordpress.org/?v=7.0 同样的 GraphQL API 请求,在浏览器中时而响应 500,且无响应数据,时而响应 200,且有响应数据 https://www.shuijingwanwq.com/2023/05/08/7611/ https://www.shuijingwanwq.com/2023/05/08/7611/#respond Mon, 08 May 2023 01:38:04 +0000 https://www.shuijingwanwq.com/?p=7611 Post Views: 78 1、同样的 GraphQL API 请求,在浏览器中时而响应 500,且无响应数据,时而响应 200,且有响应数据。如图1
同样的 GraphQL API 请求,在浏览器中时而响应 500,且无响应数据,时而响应 200,且有响应数据

图1

2、当响应 500 时,无响应数据。决定设置错误级别,以输出更为详细的错误日志。在入口文件 index.php 中,编写如下实现。如图2
当响应 500 时,无响应数据。决定设置错误级别,以输出更为详细的错误日志。在入口文件 index.php 中,编写如下实现

图2



ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
ini_set('error_log', '/tmp/php_errors.log');


3、当响应 500 后,查看文件 /tmp/php_errors.log。PHP Fatal error: Allowed memory size of 134217728 bytes exhausted 。内容如下。如图3
当响应 500 后,查看文件 /tmp/php_errors.log。PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted 。内容如下

图3



/var/www # cd /tmp
/tmp # ls
php_errors.log
/tmp # cat php_errors.log 
[19-Apr-2023 17:12:22 Asia/Shanghai] PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 12288 bytes) in /var/www/object/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php on line 262
[19-Apr-2023 17:12:22 Asia/Shanghai] PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 65536 bytes) in /var/www/object/vendor/composer/ClassLoader.php on line 571


4、在入口文件 index.php 中,调整内存大小限制为 1000M ,一直响应 200。确认程序中某处内存占用过大。


ini_set('memory_limit', '1000M');


5、编辑 /var/www/object/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php ,在 262 行附近,打印出相应数据输出至日志文件中。如图4
编辑 /var/www/object/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php ,在 262 行附近,打印出相应数据输出至日志文件中

图4



file_put_contents(storage_path() . '/logs/doFetchAll-slice.txt', print_r($slice, true), FILE_APPEND | LOCK_EX);
file_put_contents(storage_path() . '/logs/doFetchAll-queryString.txt', print_r($this->queryString, true), FILE_APPEND | LOCK_EX);
$data = parent::fetchAll(...$slice);
file_put_contents(storage_path() . '/logs/doFetchAll-data.txt', print_r($data, true), FILE_APPEND | LOCK_EX);




/var/www/object/storage/logs # ls -l
total 65604
-rw-r--r--    1 www      www       65711812 Apr 20 01:43 doFetchAll-data.txt
-rw-r--r--    1 www      www          50958 Apr 20 01:43 doFetchAll-queryString.txt
-rw-r--r--    1 www      www           4820 Apr 20 01:43 doFetchAll-slice.txt
-rw-r--r--    1 www      www           4530 Apr 20 01:43 explicabo78.log
/var/www/object/storage/logs # 


6、基于日志文件分析得出原因,在执行 SQL 查询时,未添加 limit 约束,进而将整张表的数据全部查询出来放入了内存中,进而导致内存超出限制。]]>
https://www.shuijingwanwq.com/2023/05/08/7611/feed/ 0
在 Laravel 6 中,任务队列一直运行中的排查分析(由于函数重复定义,PHP 会 发出致命错误(fatal error)) https://www.shuijingwanwq.com/2022/11/14/7149/ https://www.shuijingwanwq.com/2022/11/14/7149/#comments Mon, 14 Nov 2022 06:55:32 +0000 https://www.shuijingwanwq.com/?p=7149 Post Views: 67 1、参考:在 Linux 、Laravel 6 中,任务队列一直运行中的排查分析(已经设置超时时间):https://www.shuijingwanwq.com/2022/11/10/7139/ 。之前的原因是由于在执行 Artisan::call 时,命令行未返回 1 进而导致判断失效。 2、但是在解决之后,再一次出现了任务队列一直运行中的情况。报错:PHP Fatal error: Cannot redeclare settingUrl() (previously declared in E:\wwwroot\object\Modules\ThemeStoreDB\Resources\setting_migrations\v2.0.23\migrate_settings_data.php:31) in E:\wwwroot\object\Modules\ThemeStoreDB\Resources\setting_migrations\v2.0.23\migrate_cart.php on line 40。如图1
再一次出现了任务队列一直运行中的情况。报错:PHP Fatal error: Cannot redeclare settingUrl() (previously declared in

图1



[2022-11-09 16:25:33][x4FpSm3puIKqXniqIAPDSVClo3G8QLNm] Processing: Modules\ThemeStoreDB\Jobs\ThemeInstallationJob
PHP Fatal error:  Cannot redeclare settingUrl() (previously declared in E:\wwwroot\object\Modules\ThemeStoreDB\Resources\setting_migrations\v2.0.23\migrate_settings_data.php:31) in E:\wwwroot\object\Modules\ThemeStoreDB\Resources\setting_migrations\v2.0.23\migrate_cart.php on line 40

   Symfony\Component\Debug\Exception\FatalErrorException  : Cannot redeclare settingUrl() (previously declared in E:\wwwroot\object\Modules\ThemeStoreDB\Resources\setting_migrations\v2.0.23\migrate_settings_data.php:31)

  at E:\wwwroot\object\Modules\ThemeStoreDB\Resources\setting_migrations\v2.0.23\migrate_cart.php:40
    36|         }
    37|     }
    38| }
    39|
  > 40| function settingUrl($url)
    41| {
    42|     if (is_null($url)) {
    43|         return null;
    44|     }


   Whoops\Exception\ErrorException  : Cannot redeclare settingUrl() (previously declared in E:\wwwroot\object\Modules\ThemeStoreDB\Resources\setting_migrations\v2.0.23\migrate_settings_data.php:31)

  at E:\wwwroot\object\Modules\ThemeStoreDB\Resources\setting_migrations\v2.0.23\migrate_cart.php:40
    36|         }
    37|     }
    38| }
    39|
  > 40| function settingUrl($url)
    41| {
    42|     if (is_null($url)) {
    43|         return null;
    44|     }

  Exception trace:

  1   Whoops\Run::handleError("Cannot redeclare settingUrl() (previously declared in E:\wwwroot\object\Modules\ThemeStoreDB\Resources\setting_migrations\v2.0.23\migrate_settings_data.php:31)", "E:\wwwroot\object\Modules\ThemeStoreDB\Resources\setting_migrations\v2.0.23\migrate_cart.php")
      E:\wwwroot\object\vendor\filp\whoops\src\Whoops\Run.php:486

  2   Whoops\Run::handleShutdown()
      [internal]:0


3、PHP Fatal error 的原因在于:在 include 所包含的文件中,由于函数重复定义,PHP 会 发出致命错误(fatal error)。 4、最终决定临时的解决方案是将所包含的文件中,重名的函数给修改为不一样的名称,以规避掉此问题。]]>
https://www.shuijingwanwq.com/2022/11/14/7149/feed/ 1
在 Laravel 6 中运行 phpunit 时报错:PHP Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 69632 bytes) https://www.shuijingwanwq.com/2022/02/09/5909/ https://www.shuijingwanwq.com/2022/02/09/5909/#respond Wed, 09 Feb 2022 09:07:42 +0000 https://www.shuijingwanwq.com/?p=5909 Post Views: 89 1、在 Laravel 6 中运行 phpunit 时报错:PHP Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 69632 bytes)。如图1
在 Laravel 6 中运行 phpunit 时报错:PHP Fatal error:  Allowed memory size of 1073741824 bytes exhausted (tried to allocate 69632 bytes)

图1



PS E:\wwwroot\object> ./vendor/bin/phpunit
PHPUnit 7.5.20 by Sebastian Bergmann and contributors.

Esetup:14.95MB memory_limit:1024M
tearDown:47.17MB memory_limit:1024M
Esetup:47.36MB memory_limit:1024M
tearDown:55.27MB memory_limit:1024M
Esetup:56.22MB memory_limit:1024M
tearDown:64.15MB memory_limit:1024M
Esetup:64.18MB memory_limit:1024M
tearDown:72.11MB memory_limit:1024M
Esetup:72.14MB memory_limit:1024M
tearDown:80.07MB memory_limit:1024M
Esetup:80.1MB memory_limit:1024M
tearDown:88.03MB memory_limit:1024M
Esetup:88.06MB memory_limit:1024M
tearDown:96.02MB memory_limit:1024M
Esetup:96.05MB memory_limit:1024M
tearDown:103.98MB memory_limit:1024M
Esetup:104.01MB memory_limit:1024M
tearDown:111.5MB memory_limit:1024M
Esetup:111.61MB memory_limit:1024M
tearDown:119.54MB memory_limit:1024M
Esetup:119.57MB memory_limit:1024M
tearDown:127.5MB memory_limit:1024M
Esetup:127.62MB memory_limit:1024M
tearDown:135.55MB memory_limit:1024M
Esetup:135.58MB memory_limit:1024M
tearDown:143.51MB memory_limit:1024M
Esetup:143.64MB memory_limit:1024M
tearDown:151.57MB memory_limit:1024M
Esetup:151.6MB memory_limit:1024M
tearDown:159.53MB memory_limit:1024M
Esetup:159.56MB memory_limit:1024M
tearDown:167.49MB memory_limit:1024M
Esetup:167.52MB memory_limit:1024M
tearDown:175.51MB memory_limit:1024M
Esetup:175.54MB memory_limit:1024M
tearDown:183.16MB memory_limit:1024M
Esetup:183.19MB memory_limit:1024M
tearDown:191.12MB memory_limit:1024M
Esetup:191.15MB memory_limit:1024M
tearDown:199.08MB memory_limit:1024M
Esetup:199.11MB memory_limit:1024M
tearDown:207.04MB memory_limit:1024M
Esetup:207.07MB memory_limit:1024M
tearDown:215MB memory_limit:1024M
Esetup:215.03MB memory_limit:1024M
tearDown:222.96MB memory_limit:1024M
Esetup:222.99MB memory_limit:1024M
tearDown:230.92MB memory_limit:1024M
Esetup:231.01MB memory_limit:1024M
tearDown:238.94MB memory_limit:1024M
Esetup:238.97MB memory_limit:1024M
tearDown:246.9MB memory_limit:1024M
Esetup:246.93MB memory_limit:1024M
tearDown:254.86MB memory_limit:1024M
Esetup:254.89MB memory_limit:1024M
tearDown:262.72MB memory_limit:1024M
Esetup:262.75MB memory_limit:1024M
tearDown:270.68MB memory_limit:1024M
Esetup:270.71MB memory_limit:1024M
tearDown:278.64MB memory_limit:1024M
Esetup:278.67MB memory_limit:1024M
tearDown:286.6MB memory_limit:1024M
Esetup:286.63MB memory_limit:1024M
tearDown:294.56MB memory_limit:1024M
Esetup:294.59MB memory_limit:1024M
tearDown:302.52MB memory_limit:1024M
Esetup:302.62MB memory_limit:1024M
tearDown:310.55MB memory_limit:1024M
Esetup:310.58MB memory_limit:1024M
tearDown:318.51MB memory_limit:1024M
Esetup:318.54MB memory_limit:1024M
tearDown:326.47MB memory_limit:1024M
Esetup:326.5MB memory_limit:1024M
tearDown:334.55MB memory_limit:1024M
Esetup:334.58MB memory_limit:1024M
tearDown:342.41MB memory_limit:1024M
Esetup:342.44MB memory_limit:1024M
tearDown:350.37MB memory_limit:1024M
Esetup:350.4MB memory_limit:1024M
tearDown:358.33MB memory_limit:1024M
Esetup:358.36MB memory_limit:1024M
tearDown:366.29MB memory_limit:1024M
Esetup:366.32MB memory_limit:1024M
tearDown:374.25MB memory_limit:1024M
Esetup:374.28MB memory_limit:1024M
tearDown:382.21MB memory_limit:1024M
Esetup:382.24MB memory_limit:1024M
tearDown:390.17MB memory_limit:1024M
Esetup:390.2MB memory_limit:1024M
tearDown:398.13MB memory_limit:1024M
Esetup:398.16MB memory_limit:1024M
tearDown:406.09MB memory_limit:1024M
Esetup:406.12MB memory_limit:1024M
tearDown:414.05MB memory_limit:1024M
Esetup:414.08MB memory_limit:1024M
tearDown:422.01MB memory_limit:1024M
Esetup:422.08MB memory_limit:1024M
tearDown:430.01MB memory_limit:1024M
Esetup:430.04MB memory_limit:1024M
tearDown:437.97MB memory_limit:1024M
Esetup:438MB memory_limit:1024M
tearDown:445.93MB memory_limit:1024M
Esetup:445.96MB memory_limit:1024M
tearDown:453.89MB memory_limit:1024M
Esetup:453.92MB memory_limit:1024M
tearDown:461.85MB memory_limit:1024M
Esetup:461.88MB memory_limit:1024M
tearDown:469.81MB memory_limit:1024M
Esetup:469.84MB memory_limit:1024M
tearDown:477.77MB memory_limit:1024M
Esetup:477.8MB memory_limit:1024M
tearDown:485.73MB memory_limit:1024M
Esetup:485.76MB memory_limit:1024M
tearDown:493.69MB memory_limit:1024M
Esetup:493.72MB memory_limit:1024M
tearDown:501.66MB memory_limit:1024M
Esetup:501.69MB memory_limit:1024M
tearDown:509.62MB memory_limit:1024M
Esetup:509.65MB memory_limit:1024M
tearDown:517.58MB memory_limit:1024M
Esetup:517.61MB memory_limit:1024M
tearDown:525.54MB memory_limit:1024M
Esetup:525.57MB memory_limit:1024M
tearDown:533.5MB memory_limit:1024M
E  63 / 211 ( 29%)
setup:533.53MB memory_limit:1024M
tearDown:541.46MB memory_limit:1024M
Esetup:541.52MB memory_limit:1024M
tearDown:549.46MB memory_limit:1024M
Esetup:549.49MB memory_limit:1024M
tearDown:557.43MB memory_limit:1024M
Esetup:557.46MB memory_limit:1024M
tearDown:565.39MB memory_limit:1024M
Esetup:565.42MB memory_limit:1024M
tearDown:573.35MB memory_limit:1024M
Esetup:573.38MB memory_limit:1024M
tearDown:581.31MB memory_limit:1024M
Esetup:581.43MB memory_limit:1024M
tearDown:589.05MB memory_limit:1024M
Esetup:589.08MB memory_limit:1024M
tearDown:597.01MB memory_limit:1024M
Esetup:597.04MB memory_limit:1024M
tearDown:604.97MB memory_limit:1024M
Esetup:605MB memory_limit:1024M
tearDown:612.93MB memory_limit:1024M
Esetup:612.96MB memory_limit:1024M
tearDown:620.89MB memory_limit:1024M
Esetup:620.92MB memory_limit:1024M
tearDown:628.85MB memory_limit:1024M
Esetup:628.88MB memory_limit:1024M
tearDown:636.81MB memory_limit:1024M
Esetup:636.84MB memory_limit:1024M
tearDown:644.77MB memory_limit:1024M
Esetup:644.8MB memory_limit:1024M
tearDown:652.98MB memory_limit:1024M
Esetup:653.01MB memory_limit:1024M
tearDown:660.94MB memory_limit:1024M
Esetup:660.97MB memory_limit:1024M
tearDown:668.9MB memory_limit:1024M
Esetup:668.93MB memory_limit:1024M
tearDown:676.86MB memory_limit:1024M
Esetup:676.89MB memory_limit:1024M
tearDown:684.82MB memory_limit:1024M
Esetup:684.89MB memory_limit:1024M
tearDown:692.83MB memory_limit:1024M
Esetup:692.85MB memory_limit:1024M
tearDown:700.79MB memory_limit:1024M
Esetup:700.81MB memory_limit:1024M
tearDown:708.75MB memory_limit:1024M
Esetup:708.77MB memory_limit:1024M
tearDown:716.71MB memory_limit:1024M
Esetup:716.73MB memory_limit:1024M
tearDown:724.67MB memory_limit:1024M
Esetup:724.69MB memory_limit:1024M
tearDown:732.63MB memory_limit:1024M
Esetup:732.65MB memory_limit:1024M
tearDown:740.59MB memory_limit:1024M
Esetup:740.61MB memory_limit:1024M
tearDown:748.55MB memory_limit:1024M
Esetup:748.58MB memory_limit:1024M
tearDown:756.51MB memory_limit:1024M
Esetup:756.54MB memory_limit:1024M
tearDown:764.47MB memory_limit:1024M
Esetup:764.5MB memory_limit:1024M
tearDown:772.43MB memory_limit:1024M
Esetup:772.51MB memory_limit:1024M
tearDown:780.44MB memory_limit:1024M
Esetup:780.47MB memory_limit:1024M
tearDown:788.4MB memory_limit:1024M
Esetup:788.43MB memory_limit:1024M
tearDown:796.36MB memory_limit:1024M
Esetup:796.39MB memory_limit:1024M
tearDown:804.32MB memory_limit:1024M
Esetup:804.35MB memory_limit:1024M
tearDown:812.28MB memory_limit:1024M
Esetup:812.31MB memory_limit:1024M
tearDown:820.24MB memory_limit:1024M
Esetup:820.27MB memory_limit:1024M
tearDown:828.2MB memory_limit:1024M
Esetup:828.23MB memory_limit:1024M
tearDown:835.96MB memory_limit:1024M
Esetup:835.99MB memory_limit:1024M
tearDown:843.92MB memory_limit:1024M
Esetup:843.95MB memory_limit:1024M
tearDown:851.88MB memory_limit:1024M
Esetup:851.91MB memory_limit:1024M
tearDown:859.84MB memory_limit:1024M
Esetup:859.87MB memory_limit:1024M
tearDown:867.8MB memory_limit:1024M
Esetup:867.83MB memory_limit:1024M
tearDown:875.76MB memory_limit:1024M
Esetup:875.79MB memory_limit:1024M
tearDown:883.72MB memory_limit:1024M
Esetup:883.75MB memory_limit:1024M
tearDown:891.68MB memory_limit:1024M
Esetup:891.71MB memory_limit:1024M
tearDown:899.64MB memory_limit:1024M
Esetup:899.67MB memory_limit:1024M
tearDown:907.6MB memory_limit:1024M
Esetup:907.66MB memory_limit:1024M
tearDown:915.48MB memory_limit:1024M
Esetup:915.51MB memory_limit:1024M
tearDown:923.44MB memory_limit:1024M
Esetup:923.47MB memory_limit:1024M
tearDown:931.4MB memory_limit:1024M
Esetup:931.43MB memory_limit:1024M
tearDown:939.36MB memory_limit:1024M
Esetup:939.39MB memory_limit:1024M
tearDown:947.32MB memory_limit:1024M
Esetup:947.35MB memory_limit:1024M
tearDown:955.28MB memory_limit:1024M
Esetup:955.31MB memory_limit:1024M
tearDown:963.24MB memory_limit:1024M
Esetup:963.27MB memory_limit:1024M
tearDown:971.2MB memory_limit:1024M
Esetup:971.23MB memory_limit:1024M
tearDown:979.16MB memory_limit:1024M
Esetup:979.26MB memory_limit:1024M
tearDown:987.19MB memory_limit:1024M
Esetup:987.22MB memory_limit:1024M
tearDown:995.05MB memory_limit:1024M
Esetup:995.07MB memory_limit:1024M
tearDown:1003.01MB memory_limit:1024M
Esetup:1003.03MB memory_limit:1024M
tearDown:1010.97MB memory_limit:1024M
PHP Fatal error:  Allowed memory size of 1073741824 bytes exhausted (tried to allocate 69632 bytes) in E:\wwwroot\object\config\us-zipcode.php on line 4
PHP Fatal error:  Allowed memory size of 1073741824 bytes exhausted (tried to allocate 32768 bytes) in E:\wwwroot\object\vendor\symfony\debug\Exception\FatalErrorException.php on line 1
setup:1011MB memory_limit:1024M

Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 69632 bytes) in E:\wwwroot\object\config\us-zipcode.php on line 4

Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 32768 bytes) in E:\wwwroot\object\vendor\symfony\debug\Exception\FatalErrorException.php on line 1
PS E:\wwwroot\object>


2、编辑 php.ini 文件,设置 memory_limit = 4096M。之前为 memory_limit = 1024M。不会再次提示内存占用超限。 3、平时在运行测试用例的时候,一般不建议全部运行,参考使用说明:可以仅运行某个目录或者某个文件。以避免耗时过久与内存占用过高。如图2
平时在运行测试用例的时候,一般不建议全部运行,参考使用说明:可以仅运行某个目录或者某个文件。以避免耗时过久与内存占用过高

图2

<pre class="wp-block-syntaxhighlighter-code">

PS E:\wwwroot\object> ./vendor/bin/phpunit -h
PHPUnit 7.5.20 by Sebastian Bergmann and contributors.

Usage: phpunit [options] UnitTest [UnitTest.php]
       phpunit [options] <directory>


</pre>
4、仅运行某个目录:tests/Unit 与 仅运行某个文件:.\tests\Unit\ExampleTest.php。占用内存就很低了。如图3
仅运行某个目录:tests/Unit 与 仅运行某个文件:.\tests\Unit\ExampleTest.php。占用内存就很低了

图3



PS E:\wwwroot\lighthouse-tutorial> ./vendor/bin/phpunit tests/Unit
PHPUnit 9.5.11 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 00:00.008, Memory: 10.00 MB

OK (1 test, 1 assertion)
PS E:\wwwroot\lighthouse-tutorial> ./vendor/bin/phpunit .\tests\Unit\ExampleTest.php
PHPUnit 9.5.11 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 00:00.008, Memory: 10.00 MB

OK (1 test, 1 assertion)


 ]]>
https://www.shuijingwanwq.com/2022/02/09/5909/feed/ 0
执行命令 composer update –ignore-platform-reqs 时,报错:Script @php artisan package:discover –ansi handling the post-autoload-dump event returned with error code 255 https://www.shuijingwanwq.com/2022/01/20/5760/ https://www.shuijingwanwq.com/2022/01/20/5760/#respond Thu, 20 Jan 2022 05:44:21 +0000 https://www.shuijingwanwq.com/?p=5760 Post Views: 285 1、执行命令 composer update –ignore-platform-reqs 时,报错:Script @php artisan package:discover –ansi handling the post-autoload-dump event returned with error code 255。如图1
执行命令 composer update --ignore-platform-reqs 时,报错:Script @php artisan package:discover --ansi handling the post-autoload-dump event returned with error code 255。

图1



PS E:\wwwroot\larabbs> composer update --ignore-platform-reqs
Loading composer repositories with package information
Updating dependencies
Nothing to modify in lock file
Installing dependencies from lock file (including require-dev)
Nothing to install, update or remove
Package swiftmailer/swiftmailer is abandoned, you should avoid using it. Use symfony/mailer instead.
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
PHP Parse error:  syntax error, unexpected '|', expecting variable (T_VARIABLE) in E:\wwwroot\larabbs\vendor\psr\log\src\LoggerInterface.php on line 30
PHP Fatal error:  Exception thrown without a stack frame in Unknown on line 0
PHP Parse error:  syntax error, unexpected '|', expecting variable (T_VARIABLE) in E:\wwwroot\larabbs\vendor\psr\log\src\LoggerInterface.php on line 30
PHP Fatal error:  Exception thrown without a stack frame in Unknown on line 0
Script @php artisan package:discover --ansi handling the post-autoload-dump event returned with error code 255
PS E:\wwwroot\larabbs>


2、为何 执行命令 composer update 时,添加了选项 –ignore-platform-reqs。原因在于 执行 composer update 时,报错:it is missing from your system. Install or enable PHP’s pcntl extension.。如图2
为何 执行命令 composer update  时,添加了选项 --ignore-platform-reqs。原因在于 执行 composer update 时,报错:it is missing from your system. Install or enable PHP's pcntl extension.。

图2



PS E:\wwwroot\larabbs> composer update
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - laravel/horizon[v5.6.0, ..., 5.x-dev] require ext-pcntl * -> it is missing from your system. Install or enable PHP's pcntl extension.
    - Root composer.json requires laravel/horizon ~5.6 -> satisfiable by laravel/horizon[v5.6.0, ..., 5.x-dev].

To enable extensions, verify that they are enabled in your .ini files:
    - C:\php-7.4.27\php.ini
You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.
PS E:\wwwroot\larabbs>


3、基于 Composer 安装 laravel/horizon 时,报错:Package laravel/horizon at version ~5.6 has requirements incompatible with your PHP version, PHP extensions and Composer version。之前执行了命令:composer require “laravel/horizon:~5.6″ –ignore-platform-reqs 。最终决定卸载掉 laravel/horizon。 4、编辑 composer.json,删除行:”laravel/horizon”: “~5.6”,,再次执行命令:composer update。报错:Class ‘Horizon’ not found。如图3
编辑 composer.json,删除行:"laravel/horizon": "~5.6",,再次执行命令:composer update。报错:Class 'Horizon' not found。

图3



PS E:\wwwroot\larabbs> composer update
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 9 updates, 1 removal
  - Removing laravel/horizon (v5.7.18)
  - Downgrading psr/log (2.0.0 => 1.1.4)
  - Downgrading symfony/css-selector (v6.0.2 => v5.4.2)
  - Downgrading symfony/deprecation-contracts (v3.0.0 => v2.5.0)
  - Downgrading symfony/event-dispatcher (v6.0.2 => v5.4.0)
  - Downgrading symfony/event-dispatcher-contracts (v3.0.0 => v2.5.0)
  - Upgrading symfony/service-contracts (v2.4.1 => v2.5.0)
  - Downgrading symfony/string (v6.0.2 => v5.4.2)
  - Downgrading symfony/translation (v6.0.2 => v5.4.2)
  - Downgrading symfony/translation-contracts (v3.0.0 => v2.5.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 9 updates, 1 removal
  - Removing laravel/horizon (v5.7.18)
  - Downgrading symfony/deprecation-contracts (v3.0.0 => v2.5.0): Extracting archive
  - Downgrading psr/log (2.0.0 => 1.1.4): Extracting archive
  - Downgrading symfony/css-selector (v6.0.2 => v5.4.2): Extracting archive
  - Downgrading symfony/event-dispatcher-contracts (v3.0.0 => v2.5.0): Extracting archive
  - Downgrading symfony/event-dispatcher (v6.0.2 => v5.4.0): Extracting archive
  - Downgrading symfony/string (v6.0.2 => v5.4.2): Extracting archive
  - Upgrading symfony/service-contracts (v2.4.1 => v2.5.0): Extracting archive
  - Downgrading symfony/translation-contracts (v3.0.0 => v2.5.0): Extracting archive
  - Downgrading symfony/translation (v6.0.2 => v5.4.2): Extracting archive
Package swiftmailer/swiftmailer is abandoned, you should avoid using it. Use symfony/mailer instead.
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi

   Error

  Class 'Horizon' not found

  at E:\wwwroot\larabbs\app\Providers\AuthServiceProvider.php:36
     32▕             // 动态返回模型对应的策略名称,如:// 'App\Model\User' => 'App\Policies\UserPolicy',
     33▕             return 'App\Policies\\'.class_basename($modelClass).'Policy';
     34▕         });
     35▕
  ➜  36▕         \Horizon::auth(function ($request) {
     37▕             // 是否是站长
     38▕             return \Auth::user()->hasRole('Founder');
     39▕         });
     40▕     }

  1   E:\wwwroot\larabbs\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:36
      App\Providers\AuthServiceProvider::boot()

  2   E:\wwwroot\larabbs\vendor\laravel\framework\src\Illuminate\Container\Util.php:40
      Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
Script @php artisan package:discover --ansi handling the post-autoload-dump event returned with error code 1
PS E:\wwwroot\larabbs>


5、手动删除配置文件 config/horizon.php 和存放在 public/vendor/horizon 文件夹中的 CSS 、JS 等页面资源文件。删除文件 app/Providers/HorizonServiceProvider.php。编辑文件,删除 Horizon 相关代码。 6、再次执行命令 composer update 时,不再报错。汲取教训,–ignore-platform-reqs 绝对不能够使用才是。如图4
再次执行命令 composer update  时,不再报错。汲取教训,--ignore-platform-reqs 绝对不能够使用才是。

图4



PS E:\wwwroot\larabbs> composer update
Loading composer repositories with package information
Updating dependencies
Nothing to modify in lock file
Installing dependencies from lock file (including require-dev)
Nothing to install, update or remove
Package swiftmailer/swiftmailer is abandoned, you should avoid using it. Use symfony/mailer instead.
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: barryvdh/laravel-debugbar
Discovered Package: facade/ignition
Discovered Package: fruitcake/laravel-cors
Discovered Package: intervention/image
Discovered Package: laravel/sail
Discovered Package: laravel/sanctum
Discovered Package: laravel/tinker
Discovered Package: laravel/ui
Discovered Package: mews/captcha
Discovered Package: mews/purifier
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Discovered Package: overtrue/laravel-lang
Discovered Package: spatie/laravel-permission
Discovered Package: summerblue/administrator
Discovered Package: summerblue/generator
Discovered Package: summerblue/laravel-active
Package manifest generated successfully.
84 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> @php artisan vendor:publish --tag=laravel-assets --ansi --force
No publishable resources for tag [laravel-assets].
Publishing complete.
PS E:\wwwroot\larabbs>


]]>
https://www.shuijingwanwq.com/2022/01/20/5760/feed/ 0
基于 Yii 2 的 HTTP 客户端扩展,上传文件,PHP Fatal Error ‘yii\base\ErrorException’ with message ‘Allowed memory size of 2147483648 bytes exhausted (tried to allocate 1084897244 bytes)’ 的分析解决 https://www.shuijingwanwq.com/2020/12/07/4644/ https://www.shuijingwanwq.com/2020/12/07/4644/#respond Mon, 07 Dec 2020 06:06:06 +0000 https://www.shuijingwanwq.com/?p=4644 Post Views: 220 1、PHP Fatal Error ‘yii\base\ErrorException’ with message ‘Allowed memory size of 2147483648 bytes exhausted (tried to allocate 1084897244 bytes)’。如图1
PHP Fatal Error 'yii\base\ErrorException' with message 'Allowed memory size of 2147483648 bytes exhausted (tried to allocate 1084897244 bytes)'。

图1



The command "'/usr/local/php/bin/php' '/mcloud/www/channel-pub-api/yii' 'upload-asset-queue/exec' '45' '7200' '1' '1010' '--verbose=1' '--color=0'" failed.

Exit Code: 255(Unknown error)

Working directory: /

Output:
================
2020-12-04 14:31:27 [45] common\jobs\UploadAssetJob (attempt: 1, pid: 1010) - Started


Error Output:
================
PHP Fatal Error 'yii\base\ErrorException' with message 'Allowed memory size of 2147483648 bytes exhausted (tried to allocate 1084897244 bytes)'

in /mcloud/www/channel-pub-api/vendor/yiisoft/yii2-httpclient/src/Request.php:381

Stack trace:
#0 [internal function]: yii\base\ErrorHandler->handleFatalError()
#1 {main}



2、下载的文件:https://webtv-test.oss-cn-beijing.aliyuncs.com/rmhadmin/vod/2020/12/02/b73b9e8c3796447494a9dbe6dc66e2ad/b73b9e8c3796447494a9dbe6dc66e2ad_h264_1200k_mp4.mp4 。其大小为 1.44 GB。在本地环境中,成功下载此文件,内存占用:6.376 MB,耗费时间:916,308 ms。如图2
下载的文件:https://webtv-test.oss-cn-beijing.aliyuncs.com/rmhadmin/vod/2020/12/02/b73b9e8c3796447494a9dbe6dc66e2ad/b73b9e8c3796447494a9dbe6dc66e2ad_h264_1200k_mp4.mp4 。其大小为 1.44 GB。在本地环境中,成功下载此文件,内存占用:6.376 MB,耗费时间:916,308 ms。

图2

3、上传的文件,其大小为 50.5 MB。在本地环境中,成功上传此文件,内存占用:164.813 MB,耗费时间:43,244 ms。上传的文件,其大小为 117 MB。在本地环境中,成功上传此文件,内存占用:362.813 MB,耗费时间:97,774 ms。可以得出结论:内存占用大约为文件大小的 3倍。如图3、图4
上传的文件,其大小为 50.5 MB。在本地环境中,成功上传此文件,内存占用:164.813 MB,耗费时间:43,244 ms。

图3

 
上传的文件,其大小为 117 MB。在本地环境中,成功上传此文件,内存占用:362.813 MB,耗费时间:97,774 ms。可以得出结论:内存占用大约为文件大小的 3倍。

图4

4、内存的占用优化,暂无更优的方案。因此,最后通过修改 php.ini 的资源限制的配置选项。memory_limit = 4096M。设置了一个脚本允许分配的最大内存量。上传的文件,其大小为 1.01 GB。未再报错。 5、但是当其上传的文件大小为 1.44 GB 时,仍然报错。memory_limit = 6144M。未再报错。


The command "'/usr/local/php/bin/php' '/mcloud/www/channel-pub-api/yii' 'upload-asset-queue/exec' '68' '7200' '1' '1012' '--verbose=1' '--color=0'" failed.

Exit Code: 255(Unknown error)

Working directory: /

Output:
================
2020-12-07 17:54:21 [68] common\jobs\UploadAssetJob (attempt: 1, pid: 1012) - Started


Error Output:
================
PHP Fatal Error 'yii\base\ErrorException' with message 'Allowed memory size of 4294967296 bytes exhausted (tried to allocate 1551797080 bytes)'

in /mcloud/www/channel-pub-api/vendor/yiisoft/yii2-httpclient/src/Request.php:391

Stack trace:
#0 [internal function]: yii\base\ErrorHandler->handleFatalError()
#1 {main}



]]>
https://www.shuijingwanwq.com/2020/12/07/4644/feed/ 0
基于 Yii 2 的 HTTP 客户端扩展,下载文件且另存为具体的文件名(下载远程文件至服务器),内存占用从 400 MB 下降至 7 MB 的实现 https://www.shuijingwanwq.com/2020/11/26/4627/ https://www.shuijingwanwq.com/2020/11/26/4627/#respond Thu, 26 Nov 2020 08:49:39 +0000 content]]> https://www.shuijingwanwq.com/?p=4627 Post Views: 99

1、现在已经实现:复制来源的资源文件至渠道发布的资源目录,返回相对路径(同步)。代码如下


    /**
     * 复制来源的资源文件至渠道发布的资源目录,返回相对路径(同步)
     * @param string $source 来源
     * 格式如下:spider
     * @param array $assets 来源的资源文件的绝对URL
     * 格式如下:
     * [
     *     [
     *         'type' => 'image',
     *         'absolute_url' => 'http://localhost/spider/storage/spider/images/1.png',
     *     ],
     *     [
     *         'type' => 'video',
     *         'absolute_url' => 'http://127.0.0.1/channel-pub-api/storage/spider/videos/7月份北上广深等十大城市租金环比上涨 看东方 20180820 高清_高清.mp4',
     *     ],
     * ]
     *
     * @return array $channelPubApiAssetAbsolutePaths 渠道发布的资源文件的相对路径
     * 格式如下:
     * [
     *     [
     *         'type' => 'image',
     *         'relative_path' => '/2018/09/20/1537439889.2333.1441541478.png',
     *     ],
     *     [
     *         'type' => 'video',
     *         'relative_path' => '/2018/09/20/1537439889.2403.62871268.mp4',
     *     ],
     * ]
     *
     * @throws UnprocessableEntityHttpException 如果来源的资源文件不是以来源的 HOME URL + BASE URL 开头,将抛出 422 HTTP 异常
     * @throws NotFoundHttpException 如果来源的资源文件不存在,将抛出 404 HTTP 异常
     * @throws ServerErrorHttpException 如果创建目录失败,将抛出 500 HTTP 异常
     * @throws ServerErrorHttpException 如果复制来源的资源文件至渠道发布的资源目录失败,将抛出 500 HTTP 异常
     * @throws \yii\base\Exception if the directory could not be created (i.e. php error due to parallel changes)
     */
    public static function copyAssetsSync($source, $assets)
    {
        // file_put_contents('/mcloud/www/channel-pub-api/console/runtime/copy-assets-sync-source-' . $source . '-' . time() . '.txt', $source);
        // file_put_contents('C:/phpStudy/PHPTutorial/WWW/channel-pub-api/douyin/runtime/copy-assets-sync-assets-' . $source . '-' . time() . '.txt', print_r($assets, true));
        // 不是以来源的 HOME URL + BASE URL 开头的来源的资源文件
        $notAbsoluteUrlStartKeys = [];
        // 不存在的来源的资源文件
        $notExistsKeys = [];
        // 渠道发布的资源文件的相对路径
        $channelPubApiAssetAbsolutePaths = [];

        foreach ($assets as $key => $asset) {
            if ($index = stripos($asset['absolute_url'], '?')) {
                $absoluteUrl = substr($asset['absolute_url'], 0, $index);
                $asset['absolute_url'] = $absoluteUrl;
                $assets[$key]['absolute_url'] = $absoluteUrl;
            }
            // 检查来源的资源文件的绝对URL是否以来源的 HOME URL + BASE URL 开头
            if (!StringHelper::startsWith($asset['absolute_url'], Yii::$app->params['source']['asset'][$asset['type']]['hostInfo'] . Yii::$app->params['source']['asset'][$asset['type']]['baseUrl'])) {
                $notAbsoluteUrlStartKeys[] = $asset['absolute_url'];
            } else {
                // 获取来源的资源文件的绝对路径
                $sourceAssetAbsolutePath = Yii::$app->params['source']['asset'][$asset['type']]['basePath'] . str_replace(Yii::$app->params['source']['asset'][$asset['type']]['hostInfo'] . Yii::$app->params['source']['asset'][$asset['type']]['baseUrl'], '', $asset['absolute_url']);
                // 检查来源的资源文件是否存在
                if (!file_exists($sourceAssetAbsolutePath)) {
                    $notExistsKeys[] = $sourceAssetAbsolutePath;
                }
            }
        }

        if (!empty($notAbsoluteUrlStartKeys)) {
            $notAbsoluteUrlStartKeys = implode(",", $notAbsoluteUrlStartKeys);
            throw new UnprocessableEntityHttpException(Yii::t('error', Yii::t('error', Yii::t('error', '202003'), ['not_absolute_url_start_keys' => $notAbsoluteUrlStartKeys])), 202003);
        }

        if (!empty($notExistsKeys)) {
            $notExistsKeys = implode(",", $notExistsKeys);
            throw new NotFoundHttpException(Yii::t('error', Yii::t('error', Yii::t('error', '202004'), ['not_exists_keys' => $notExistsKeys])), 202004);
        }

        foreach ($assets as $key => $asset) {
            // 获取来源的资源文件的绝对路径
            $sourceAssetAbsolutePath = Yii::$app->params['source']['asset'][$asset['type']]['basePath'] . str_replace(Yii::$app->params['source']['asset'][$asset['type']]['hostInfo'] . Yii::$app->params['source']['asset'][$asset['type']]['baseUrl'], '', $asset['absolute_url']);

            // 获取来源的资源文件的路径信息
            $pathInfo = pathinfo($sourceAssetAbsolutePath);
            // 渠道发布的资源文件的相对路径
            $directory = date('Y/m/d');
            $channelPubApiAssetRelativePath = '/' . $directory . '/' . microtime(true) . '.' . mt_rand() . '.' . $pathInfo['extension'];
            // 渠道发布的资源文件的绝对路径
            $channelPubApiAssetAbsolutePath = Yii::$app->params['channelPubApi']['asset'][$asset['type']]['basePath'] . $channelPubApiAssetRelativePath;
            // 创建目录
            if (!FileHelper::createDirectory(Yii::$app->params['channelPubApi']['asset'][$asset['type']]['basePath'] . '/' . $directory)) {
                throw new ServerErrorHttpException(Yii::t('error', Yii::t('error', Yii::t('error', '202005'), ['directory' => Yii::$app->params['channelPubApi']['asset'][$asset['type']]['basePath'] . '/' . $directory])), 202005);
            }
            // 复制来源的资源文件至渠道发布的资源目录
            if (!copy($sourceAssetAbsolutePath, $channelPubApiAssetAbsolutePath)) {
                throw new ServerErrorHttpException(Yii::t('error', Yii::t('error', Yii::t('error', '202006'), ['source_asset_absolute_path' => $sourceAssetAbsolutePath])), 202006);
            }

            $channelPubApiAssetAbsolutePaths[$key] = [
                'type' => $asset['type'],
                'relative_path' => $channelPubApiAssetRelativePath,
            ];
        }

        return $channelPubApiAssetAbsolutePaths;
    }


2、现在需要有所调整,能够再实现:下载文件且另存为具体的文件名,而不是复制。

3、先验证第一步骤的实现。调用此方法,打印响应结果,代码如下


        $copyAssetsResult = AssetService::copyAssetsSync(
            'spider',
            [
                [
                    'type' => 'image',
                    'absolute_url' => 'http://127.0.0.1/channel-pub-api/storage/spider/images/1.png',
                ],
                [
                    'type' => 'video',
                    'absolute_url' => 'http://127.0.0.1/channel-pub-api/storage/spider/videos/02018684a82381d9c59bb085e18e1a5d.mp4',
                ],
            ]
        );

        print_r($copyAssetsResult);
        exit;


4、打印响应结果,如图1

打印响应结果

图1


Array
(
    [0] => Array
        (
            [type] => image
            [relative_path] => /2020/11/24/1606187993.2607.476899553.png
        )

    [1] => Array
        (
            [type] => video
            [relative_path] => /2020/11/24/1606187993.2711.210785146.mp4
        )

)



5、查看渠道发布的资源目录中,复制后的文件。其绝对路径分别为:E:\wwwroot\channel-pub-api\storage\channel-pub-api\images\2020\11\24\1606187993.2607.476899553.png、E:\wwwroot\channel-pub-api\storage\channel-pub-api\videos\2020\11\24\1606187993.2711.210785146.mp4。如图2

查看渠道发布的资源目录中,复制后的文件。其绝对路径分别为:E:\wwwroot\channel-pub-api\storage\channel-pub-api\images\2020\11\24\1606187993.2607.476899553.png、E:\wwwroot\channel-pub-api\storage\channel-pub-api\videos\2020\11\24\1606187993.2711.210785146.mp4。

图2

6、实现 HTTP 模型,/common/logics/http/asset_api/Download.php

<?php
/**
 * Created by PhpStorm.
 * User: Qiang Wang
 * Date: 2020/11/24
 * Time: 15:47
 */
 
namespace common\logics\http\asset_api;
 
use Yii;
use yii\base\InvalidConfigException;
use yii\httpclient\Client;
use yii\httpclient\Exception;
use yii\web\ServerErrorHttpException;
 
/**
 * 资源接口的下载
 *
 * @author Qiang Wang <shuijingwanwq@163.com>
 * @since 1.0
 */
class Download extends Model
{
    /**
     * HTTP请求,基于来源的资源文件的绝对URL下载文件
     *
     * @param string $url 来源的资源文件的绝对URL
     *
     * @return string
     * 格式如下:
     *
     * @throws ServerErrorHttpException 如果响应状态码不等于20x
     * @throws InvalidConfigException
     * @throws Exception
     */
    public function download($url)
    {
        $client = new Client([
            'transport' => 'yii\httpclient\CurlTransport' // 只有 cURL 支持此选项
        ]);
        $response = $client->createRequest()
            ->setMethod('GET')
            ->setUrl($url)
            ->send();
        // 检查响应状态码是否等于20x
        if ($response->isOk) {
            return $response->content;
        } else {
            throw new ServerErrorHttpException(Yii::t('error', Yii::t('error', Yii::t('error', '202218'), ['status_code' => $response->getStatusCode()])), 202218);
        }
    }
}

7、新的实现:下载来源的资源文件后写入至渠道发布的资源目录,返回相对路径(同步)。代码如下


            /* HTTP请求,基于来源的资源文件的绝对URL下载文件 */
            $httpAssetApiDownload = new HttpAssetApiDownload();

            foreach ($assets as $key => $asset) {
                $downloadAsset = $httpAssetApiDownload->download($asset['absolute_url']);

                // 渠道发布的资源文件的相对路径
                $directory = date('Y/m/d');

                $channelPubApiAssetRelativePath = '/' . $directory . '/' . microtime(true) . '.' . mt_rand() . '.' . $asset['extension'];
                // 渠道发布的资源文件的绝对路径
                $channelPubApiAssetAbsolutePath = Yii::$app->params['channelPubApi']['asset'][$asset['type']]['basePath'] . $channelPubApiAssetRelativePath;
                // 创建目录
                if (!FileHelper::createDirectory(Yii::$app->params['channelPubApi']['asset'][$asset['type']]['basePath'] . '/' . $directory)) {
                    throw new ServerErrorHttpException(Yii::t('error', Yii::t('error', Yii::t('error', '202005'), ['directory' => Yii::$app->params['channelPubApi']['asset'][$asset['type']]['basePath'] . '/' . $directory])), 202005);
                }
                // 下载来源的资源文件后写入至渠道发布的资源目录
                if (!file_put_contents($channelPubApiAssetAbsolutePath, $downloadAsset, LOCK_EX)) {
                    throw new ServerErrorHttpException(Yii::t('error', Yii::t('error', Yii::t('error', '202220'), ['source_asset_absolute_url' => $asset['source_asset_absolute_url']])), 202220);
                }

                $channelPubApiAssetAbsolutePaths[$key] = [
                    'type' => $asset['type'],
                    'relative_path' => $channelPubApiAssetRelativePath,
                ];
            }


8、运行代码,视频文件的大小为:396 MB,报错:Allowed memory size of 134217728 bytes exhausted (tried to allocate 62918656 bytes)。如图3

运行代码,视频文件的大小为:396 MB,报错:Allowed memory size of 134217728 bytes exhausted (tried to allocate 62918656 bytes)。

图3


{
    "name": "PHP Fatal Error",
    "message": "Allowed memory size of 134217728 bytes exhausted (tried to allocate 62918656 bytes)",
    "code": 1,
    "type": "yii\\base\\ErrorException",
    "file": "E:\\wwwroot\\channel-pub-api\\vendor\\yiisoft\\yii2-httpclient\\src\\CurlTransport.php",
    "line": 40,
    "stack-trace": [
        "#0 [internal function]: yii\\base\\ErrorHandler->handleFatalError()",
        "#1 {main}"
    ]
}


9、编辑 php.ini 文件,修改 memory_limit = 128M 为 memory_limit = 1024M。设置为 512M 时仍然报错。运行成功。查看日志,占用内存:406 MB。如图4

编辑 php.ini 文件,修改 memory_limit = 128M 为 memory_limit = 1024M。设置为 512M 时仍然报错。运行成功。查看日志,占用内存:406 MB。

图4

10、查看渠道发布的资源目录中,复制后的文件。其绝对路径分别为:E:\wwwroot\channel-pub-api\storage\channel-pub-api\images\2020\11\25\1606291709.4136.2030184970.png、E:\wwwroot\channel-pub-api\storage\channel-pub-api\videos\2020\11\25\1606291735.722.2031039128.mp4。符合预期。如图5

查看渠道发布的资源目录中,复制后的文件。其绝对路径分别为:E:\wwwroot\channel-pub-api\storage\channel-pub-api\images\2020\11\25\1606291709.4136.2030184970.png、E:\wwwroot\channel-pub-api\storage\channel-pub-api\videos\2020\11\25\1606291735.722.2031039128.mp4。符合预期。

图5

11、此方案的问题在于:内存占用随着下载文件的大小而变化。可能因为下载文件的大小超出 memory_limit 而失败。决定再想办法优化完善。

12、重构 HTTP 模型,/common/logics/http/asset_api/Download.php。使用方法:setOutputFile()。与 yii\httpclient\CurlTransport 一起使用以设置传输写入的文件。如图6

重构 HTTP 模型,/common/logics/http/asset_api/Download.php。使用方法:setOutputFile()。与 yii\httpclient\CurlTransport 一起使用以设置传输写入的文件。

图6

<?php
/**
 * Created by PhpStorm.
 * User: Qiang Wang
 * Date: 2020/11/24
 * Time: 15:47
 */
 
namespace common\logics\http\asset_api;
 
use Yii;
use yii\base\InvalidConfigException;
use yii\httpclient\Client;
use yii\httpclient\Exception;
use yii\web\ServerErrorHttpException;
 
/**
 * 资源接口的下载
 *
 * @author Qiang Wang <shuijingwanwq@163.com>
 * @since 1.0
 */
class Download extends Model
{
    /**
     * HTTP请求,基于来源的资源文件的绝对URL下载文件
     *
     * @param string $url 来源的资源文件的绝对URL
     * @param string $absolutePath 资源文件的绝对路径(下载至的目标路径)
     *
     * @return bool
     * 格式如下:true
     *
     * @throws ServerErrorHttpException 如果响应状态码不等于20x
     * @throws InvalidConfigException
     * @throws Exception
     */
    public function download($url, $absolutePath)
    {
        // 打开即将下载的本地文件,在该文件上打开一个流
        $handle = fopen($absolutePath, 'w');
        if (!$handle) {
            throw new ServerErrorHttpException(Yii::t('error', Yii::t('error', Yii::t('error', '202220'), ['absolute_path' => $absolutePath])), 202220);
        }
 
        $client = new Client([
            'transport' => 'yii\httpclient\CurlTransport' // 只有 cURL 支持此选项
        ]);
        $response = $client->createRequest()
            ->setMethod('GET')
            ->setUrl($url)
            ->setOutputFile($handle)
            ->send();
 
        // 关闭一个已打开的文件指针
        fclose($handle);
 
        // 检查响应状态码是否等于20x
        if ($response->isOk) {
            return $response->content;
        } else {
            throw new ServerErrorHttpException(Yii::t('error', Yii::t('error', Yii::t('error', '202218'), ['status_code' => $response->getStatusCode()])), 202218);
        }
    }
}
 

13、重构新的实现:下载来源的资源文件同步写入至渠道发布的资源目录,返回相对路径(同步)。代码如下


            /* HTTP请求,基于来源的资源文件的绝对URL下载文件 */
            $httpAssetApiDownload = new HttpAssetApiDownload();

            foreach ($assets as $key => $asset) {

                // 渠道发布的资源文件的相对路径
                $directory = date('Y/m/d');

                $channelPubApiAssetRelativePath = '/' . $directory . '/' . microtime(true) . '.' . mt_rand() . '.' . $asset['extension'];
                // 渠道发布的资源文件的绝对路径
                $channelPubApiAssetAbsolutePath = Yii::$app->params['channelPubApi']['asset'][$asset['type']]['basePath'] . $channelPubApiAssetRelativePath;
                // 创建目录
                if (!FileHelper::createDirectory(Yii::$app->params['channelPubApi']['asset'][$asset['type']]['basePath'] . '/' . $directory)) {
                    throw new ServerErrorHttpException(Yii::t('error', Yii::t('error', Yii::t('error', '202005'), ['directory' => Yii::$app->params['channelPubApi']['asset'][$asset['type']]['basePath'] . '/' . $directory])), 202005);
                }

                // HTTP请求,基于来源的资源文件的绝对URL下载文件
                $httpAssetApiDownload->download($asset['absolute_url'], $channelPubApiAssetAbsolutePath);

                $channelPubApiAssetAbsolutePaths[$key] = [
                    'type' => $asset['type'],
                    'relative_path' => $channelPubApiAssetRelativePath,
                ];
            }


14、运行成功。查看日志,占用内存:6.377 MB。下载文件的大小不再受到 memory_limit 的限制。如图7

运行成功。查看日志,占用内存:6.377 MB。下载文件的大小不再受到 memory_limit 的限制。

图7

15、为何采用 cURL ,原因在于:cURL 的性能优于 file_get_contents 和 fopen。但是可以肯定的是内存占用优于 file_get_contents。未经测试,此结论为 PHP 官方文档所述。链接:https://www.php.net/manual/zh/ref.curl.php 。如图8

为何采用 cURL ,原因在于:cURL 的性能优于 file_get_contents 和 fopen。但是可以肯定的是内存占用优于 file_get_contents。未经测试,此结论为 PHP 官方文档所述。链接:https://www.php.net/manual/zh/ref.curl.php 。

图8

]]>
https://www.shuijingwanwq.com/2020/11/26/4627/feed/ 0
PHP message PHP Fatal error require() Failed opening required ‘mcloudwwwcmcp-apivendorcomposer..myclabsdeep-copysrcDeepCopydeep_copy.php’ 的分析解决 https://www.shuijingwanwq.com/2020/08/04/4344/ https://www.shuijingwanwq.com/2020/08/04/4344/#respond Tue, 04 Aug 2020 02:02:46 +0000 https://www.shuijingwanwq.com/?p=4344 Post Views: 149 1、查看 Nginx 的错误日志:PHP message: PHP Fatal error: require(): Failed opening required ‘/mcloud/www/cmcp-api/vendor/composer/../myclabs/deep-copy/src/DeepCopy/deep_copy.php’。如图1
查看 Nginx 的错误日志:PHP message: PHP Fatal error:  require(): Failed opening required '/mcloud/www/cmcp-api/vendor/composer/../myclabs/deep-copy/src/DeepCopy/deep_copy.php'。

图1

2、查看 Gitlab 上的文件,发现目录:/vendor/composer/../myclabs/deep-copy 为空目录。如图2
查看 Gitlab 上的文件,发现目录:/vendor/composer/../myclabs/deep-copy 为空目录。

图2

3、删除 \vendor\myclabs\deep-copy\.git 目录。如图3
删除 \vendor\myclabs\deep-copy\.git 目录。

图3

4、选择相应的文件,添加。如图4
选择相应的文件,添加。

图4

5、提交。如图5
提交。

图5

6、全部 – 提交 – 推送。如图6
全部 - 提交 - 推送。

图6

7、查看 Gitlab 上的文件,发现目录:/vendor/composer/../myclabs/deep-copy 下已经存在相应的文件。如图7
查看 Gitlab 上的文件,发现目录:/vendor/composer/../myclabs/deep-copy 下已经存在相应的文件。

图7

8、构建镜像时报错:Step 4/7 : COPY code /mcloud/www/cmcp-api。Error processing tar file(exit status 1): open /vendor/myclabs/deep-copy/fixtures/f005/Foo.php: no such file or directory。如图8
构建镜像时报错:Step 4/7 : COPY code /mcloud/www/cmcp-api。Error processing tar file(exit status 1): open /vendor/myclabs/deep-copy/fixtures/f005/Foo.php: no such file or directory。

图8

9、查看 Gitlab 上的文件,发现文件:/vendor/myclabs/deep-copy/fixtures/f005/Foo.php 是存在的。如图9
查看 Gitlab 上的文件,发现文件:/vendor/myclabs/deep-copy/fixtures/f005/Foo.php 是存在的。

图9

10、再次构建,构建成功。如图10
再次构建,构建成功。

图10

11、后续还存在类似的问题。如下: 12、在目录 /vendor 中搜索:.git,发现存在数十个 .git。最终决定删除 /vendor,然后 composer install,重新安装,再删除每个目录中的 .git。重新提交推送。如图11
在目录 /vendor 中搜索:.git,发现存在数十个 .git。最终决定删除 /vendor,然后 composer install,重新安装,再删除每个目录中的 .git。重新提交推送。

图11



PHP message: PHP Fatal error:  require(): Failed opening required '/mcloud/www/cmcp-api/vendor/composer/../paragonie/random_compat/lib/random.php'

PHP message: PHP Fatal error:  require(): Failed opening required '/mcloud/www/cmcp-api/vendor/composer/../guzzlehttp/promises/src/functions_include.php'


13、查看 Nginx 的错误日志,未再报错。符合预期。 14、参考我应该提交 vendor 目录中的依赖包吗?:https://docs.phpcomposer.com/faqs/should-i-commit-the-dependencies-in-my-vendor-directory.html 。我是采用的第 3 种方案。实际上感觉采用第 4 种方案,工作量会相对更小一些。如图12
参考我应该提交 vendor 目录中的依赖包吗?:https://docs.phpcomposer.com/faqs/should-i-commit-the-dependencies-in-my-vendor-directory.html 。我是采用的第 3 种方案。实际上感觉采用第 4 种方案,工作量会相对更小一些。

图12

]]>
https://www.shuijingwanwq.com/2020/08/04/4344/feed/ 0