swoole/swoole-cli

未定义常量 GLOB_BRACE 的使用 in docker Alpine Linux

Closed this issue · 6 comments

未定义常量 GLOB_BRACE 的使用 in docker Alpine Linux

@netyum

未定义常量 GLOB_BRACE 的使用 in docker Alpine Linux

你的运行命令是啥?

netyum commented
<?php
var_dump(GLOB_BRACE);
PHP Fatal error:  Uncaught Error: Undefined constant "GLOB_BRACE" in /root/1.php:3
Stack trace:
#0 {main}
  thrown in /root/1.php on line 3

php glob函数参数, 如果可以,不用Alpine Linux 作为 linux build镜像

@netyum 看这里 https://www.php.net/manual/zh/function.glob.php 官网提供的信息: 注意: GLOB_BRACE 在一些非 GNU 系统上无效,比如 Solaris 和 Alpine Linux 。

你可以自己用 debian 构建 :

https://github.com/swoole/swoole-cli/tree/main/sapi/quickstart/linux 选择 run-debian-11-container.sh

问题所在: 其实是libc 的实现问题 (musl libc 和 glibc );

核心关键点: musl-libc 是硬性要求;

netyum commented

你是说硬性指标只有musl-libc才能过静态编译?

@netyum
你可以用glibc 编译几次就知道了。
glibc 可以静态编译,但是编译结果拷贝到 非 GNU 系统下就用不了。

比如 x86_64架构下debian里下,用glibc 静态编译出来的php 解释器,拷贝到alpine 系统下,用不了

你可以尝试下:

你在debian 或者 ubuntu 系统下: 把这个 改成 protected string $cCompiler = 'clang'; 换成gcc ,编译出来, GLOB_BRACE 未定义的问题,应该就解决了。

要使用libc
debian 系统下编译器组合:
cc=musl-gcc
cxx=gcc

或者:
cc=clang
cxx=clang++

alpine: 系统下编译器组合: (alpine 默认使用musl-gcc 替代gcc)
cc=gcc
cxx=g++

或者
cc=clang
cxx=clang++

netyum commented

好的我试试,最终还是要依赖glibc