crazywhalecc / static-php-cli

Build standalone PHP binary on Linux, macOS, FreeBSD, Windows, with PHP project together, with popular extensions included.
https://static-php.dev
MIT License
1.27k stars 223 forks source link

提示Fatal error: Allowed memory size of 134217728 bytes exhausted #93

Closed wensenz closed 1 year ago

wensenz commented 1 year ago

错误如图

image

我用yii2 打包成执行文件提示内存不够, 原basic.phar是可用的:

image

我build micro.sfx 时已经尝试将php.ini改成1024M但还是提示不行

也试了将basic项目首行添加ini_set('memory_limit', '-1');, 也不行

crazywhalecc commented 1 year ago

有最小复现的 phar 包吗?(如果涉及闭源代码或不方便分享的代码,建议先裁剪,或者提供一个 phar 文件打包的流程、static-php-cli 构建 micro.sfx 的流程以及运行 welldone 二进制的系统环境(架构、发行版)。

wensenz commented 1 year ago

使用的系统是mac 13.4.1 (22F82), 编译的工具是 box:https://github.com/box-project/box, phar包是开源的yii2基础包:composer create-project --prefer-dist yiisoft/yii2-app-basic basic ,https://www.yiiframework.com/doc/guide/2.0/zh-cn/start-installation

wensenz commented 1 year ago

phar包也可以提供, 我可以怎么发送给您?

crazywhalecc commented 1 year ago

如果不大的话,可以直接发邮件到我的邮箱 admin@zhamao.me。比较大的话可以通过任意网盘发给我。

wensenz commented 1 year ago

补充下信息: 我使用的PHP版本是:8.2.8 yii2的版本是:2.0.48.1 网盘地址:链接: https://pan.baidu.com/s/1sFBVJ-VD-mMwbWKIcFUygQ?pwd=wg6h 提取码: wg6h 复制这段内容后打开百度网盘手机App,操作更方便哦

使用box打包的box.json: { "alias": "basic.phar", "chmod": "0755", "directories": [ "/Users/zhongzhengwen/www/basic" ], "finder": [ { "name": "*.php", "exclude": [ "tests", "Tests" ], "in": "/Users/zhongzhengwen/www/basic/vendor" } ], "main": "/Users/zhongzhengwen/www/basic/yii", "output": "basic.phar" }

crazywhalecc commented 1 year ago

排查了半天,可能是由于 static-php-cli 编译 PHP 时候的优化参数在部分 macOS 会导致裁剪错乱,从而导致任何 phar 包都可能无法正常执行。

但内存过大可能还是因为项目本身的原因,目前排除掉裁剪优化的问题后其他 phar 包正常,但是 basic.phar 目前我无法操作。但通过对 phpmicro 注入 ini 文件内容 memory_limit=2G 再打包项目即正常运行。

有关给 phpmicro 注入 ini 配置见 Wiki

crazywhalecc commented 1 year ago

但目前看起来这个打包的项目无法直接运行,猜测可能是 Yii 框架启动 Web 服务是调用了 php -S 内置服务器启动运行代码,这种运行方式和传统的 php-cgi、php-fpm 类似,为每次运行代码后销毁进程内容的模式,本项目的 micro.sfx 仅支持启动 CLI 为基础的项目,例如 Workerman、Swoole、Amphp 等,如果使用 PHP_BINARY -S 方式运行的话,会出现无法找到 PHP_BINARY 的问题。目前架构下的 phpmicro 是不支持 php -S 方式运行自身代码的,只支持 CLI 项目。

image
wensenz commented 1 year ago

Allowed memory 问题已经通过注入ini的方式解决了, 感谢!

wensenz commented 1 year ago

但目前看起来这个打包的项目无法直接运行,猜测可能是 Yii 框架启动 Web 服务是调用了 php -S 内置服务器启动运行代码,这种运行方式和传统的 php-cgi、php-fpm 类似,为每次运行代码后销毁进程内容的模式,本项目的 micro.sfx 仅支持启动 CLI 为基础的项目,例如 Workerman、Swoole、Amphp 等,如果使用 PHP_BINARY -S 方式运行的话,会出现无法找到 PHP_BINARY 的问题。目前架构下的 phpmicro 是不支持 php -S 方式运行自身代码的,只支持 CLI 项目。

image

我的意图也不是需要用php -s 来执行项目, 我想知道配合nginx, 我该怎么去做, @crazywhalecc 你看能不能提供一点思路

以下是源码nginx配置:

server {
    charset utf-8;
    client_max_body_size 128M;

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

    server_name mysite.test;
    root        /path/to/basic/web;
    index       index.php;

    access_log  /path/to/basic/log/access.log;
    error_log   /path/to/basic/log/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;
    }

那我打包后应该是怎样的

crazywhalecc commented 1 year ago

如果你的项目是传统 fpm 架构的话,其实并不推荐你使用本项目将 PHP 本身打包为单一二进制,或者将 PHP 和 PHP 代码打包为一个可执行文件。如果是对于项目分发有需求要打包为单一文件的话,可以只使用 box 将项目打包为 phar,并投放到 web 目录。我记得可以直接将 phar 配置为 web 根目录,但具体配置我也不是很清楚,很久不写 fpm 的项目了。