linux 上绿色版的 php 怎么弄?

2016-11-01 17:17:51 +08:00
 gouchaoer

我想得到一个 linux 下的完全不依赖系统动态链接库的 php-cli 的 binary (绿色版的 php ,可以自带一些 so 库)和 php 脚本代码一起分发做一些琐碎的运维工作(比较熟悉 php ,但是在系统上装 php 显得太麻烦了),在 windows 下 windows.php.net 提供了这样的绿色版的 php 包( http://windows.php.net/download )用起来很好用,但是 linux 下我查了一下发现似乎有困难: http://stackoverflow.com/questions/24173906/compile-php-into-static-binary 。。。我下载了 xampp 的 linux 版本研究了一下发现的确也是动态链接了许多库。。。问一下诸位可有思路?

5477 次点击
所在节点    问与答
45 条回复
msg7086
2016-11-02 01:44:19 +08:00
@helloccav 带手机出门啊。
所以为什么放着「胜在方便」的 Python 不用,要背着沉重的 PHP 全家桶出门呢……
qw7692336
2016-11-02 02:32:48 +08:00
于是有了 docker
txlty
2016-11-02 02:32:56 +08:00
以前找到过一个安卓(arm)版, 5.5 的。从此可以在手机上跑 php 脚本了。但查不到源头是谁编译的。
twl007
2016-11-02 04:57:01 +08:00
@gouchaoer 我好奇的问一下装个 php 怎么会污染环境? 而且安装的时候会出现什么问题 = = ||||
bsidb
2016-11-02 07:58:55 +08:00
docker 简直不能再合适。
Sasasu
2016-11-02 09:03:11 +08:00

只依赖 glibc libxml2 xz zlib
这几个都是 linux 的核心包了
https://www.archlinux.org/packages/core/x86_64/glibc/
https://www.archlinux.org/packages/extra/x86_64/libxml2/
https://www.archlinux.org/packages/core/x86_64/xz/
https://www.archlinux.org/packages/core/x86_64/zlib/
就算只有 busybox,也有这几个库.

php7 的下载地址在我这边无法访问,只能编译一个 5.3 了

另外喜欢用各种绿色版软件个 windowse er 们,你们数数自己电脑里大概有几个 chromium,几十个 qt,几百个 jq 吧..
lslqtz
2016-11-02 09:16:46 +08:00
@Sasasu +1
再数数有几个非绿色版的运行库...
Sasasu
2016-11-02 09:18:53 +08:00

我相信这是你想要的 :> 我去看了看 makefile,改了一下

php -info :http://paste.ubuntu.com/23414142/
suconghou
2016-11-02 10:16:42 +08:00
@Sasasu 能否指明需要修改的地方?
gouchaoer
2016-11-02 11:43:51 +08:00
@Sasasu 你贴个 phpinfo 有啥用?
gouchaoer
2016-11-02 11:46:16 +08:00
@Sasasu 我用 php 官方的 docker 镜像里自己 build 了一下,参数如下:

`./configure --enable-static --enable-cli --disable-all`,结果 build 出来还是 dynamically linked
```
root@af256ed09c1b:/usr/src/php-7.0.11/sapi/cli# php -v
PHP 7.0.11 (cli) (built: Sep 16 2016 20:15:56) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.11, Copyright (c) 1999-2016, by Zend Technologies
root@af256ed09c1b:/usr/src/php-7.0.11/sapi/cli# ldd ./php
linux-vdso.so.1 (0x00007fff2c1fe000)
libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f9f9d097000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f9f9ce80000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f9f9cc77000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9f9c976000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9f9c772000)
libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007f9f9c559000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9f9c1ae000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9f9bf91000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9f9d2d5000)
root@af256ed09c1b:/usr/src/php-7.0.11/sapi/cli#
root@af256ed09c1b:/usr/src/php-7.0.11/sapi/cli#
root@af256ed09c1b:/usr/src/php-7.0.11/sapi/cli# file php
php: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=27acbcf095385667e7581668e8422470fd9b09db, not stripped
root@af256ed09c1b:/usr/src/php-7.0.11/sapi/cli#

```
wallax
2016-11-02 11:48:49 +08:00
可以试试 docker+alpine 来做底包
jasontse
2016-11-02 11:49:39 +08:00
dotdeb 这事不就解决了么
gouchaoer
2016-11-02 12:04:28 +08:00
@Sasasu prefix 的那个在 php7 下试过不行:
root@f1900c42a247:/usr/src/php-7.0.11# ./configure --enable-static --enable-cli --disable-all --prefix=.
configure: error: expected an absolute directory name for --prefix: .
root@f1900c42a247:/usr/src/php-7.0.11# ./configure --enable-static --enable-cli --disable-all --prefix=./
configure: error: expected an absolute directory name for --prefix: .
root@f1900c42a247:/usr/src/php-7.0.11#


在./configure 后生成的 Makefile 也读了但是不太懂 makefile ,请问在哪里加 static 呢?静态链接不是需要静态编译链接库*.a 这样么?我只看到 build 出来了动态链接库*.so 啊
chenlongwen
2016-11-02 12:27:39 +08:00
之前,安装 mcpe 服务器软件 pocketmine 的时候,官方提供的就是编译好的平台通用的。
https://bintray.com/pocketmine/PocketMine/Unix-PHP-Binaries

https://github.com/PocketMine/php-build-scripts
gouchaoer
2016-11-02 12:39:33 +08:00
@chenlongwen 这个我下载下来了,里面的 php-cli 上传到 vps 上发现是动态链接的
```
root@f1900c42a247:/app/php5/bin# ./php
bash: ./php: Permission denied
root@f1900c42a247:/app/php5/bin# ldd ./php
linux-vdso.so.1 (0x00007fffe0bf6000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fcf42a07000)
libyaml-0.so.2 => not found
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007fcf427ef000)
libleveldb.so.1 => /app/php5/bin/./../lib/libleveldb.so.1 (0x00007fcf42599000)
libpng16.so.16 => not found
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fcf42297000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fcf42093000)
libcurl.so.4 => /usr/lib/x86_64-linux-gnu/libcurl.so.4 (0x00007fcf41e1e000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fcf41c01000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcf41856000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fcf4154a000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fcf41334000)
/lib64/ld-linux-x86-64.so.2 (0x00007fcf42c29000)
libidn.so.11 => /usr/lib/x86_64-linux-gnu/libidn.so.11 (0x00007fcf41100000)
librtmp.so.1 => /usr/lib/x86_64-linux-gnu/librtmp.so.1 (0x00007fcf40ee1000)
libssh2.so.1 => /usr/lib/x86_64-linux-gnu/libssh2.so.1 (0x00007fcf40cb8000)
libssl.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007fcf40a57000)
libcrypto.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fcf4065a000)
libgssapi_krb5.so.2 => /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007fcf4040f000)
libkrb5.so.3 => /usr/lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007fcf4013b000)
libk5crypto.so.3 => /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007fcf3ff09000)
libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007fcf3fd05000)
liblber-2.4.so.2 => /usr/lib/x86_64-linux-gnu/liblber-2.4.so.2 (0x00007fcf3faf6000)
libldap_r-2.4.so.2 => /usr/lib/x86_64-linux-gnu/libldap_r-2.4.so.2 (0x00007fcf3f8a3000)
libgnutls-deb0.so.28 => /usr/lib/x86_64-linux-gnu/libgnutls-deb0.so.28 (0x00007fcf3f584000)
libhogweed.so.2 => /usr/lib/x86_64-linux-gnu/libhogweed.so.2 (0x00007fcf3f354000)
libnettle.so.4 => /usr/lib/x86_64-linux-gnu/libnettle.so.4 (0x00007fcf3f122000)
libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fcf3ee9f000)
libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007fcf3ebbc000)
libkrb5support.so.0 => /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007fcf3e9b0000)
libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007fcf3e7ac000)
libsasl2.so.2 => /usr/lib/x86_64-linux-gnu/libsasl2.so.2 (0x00007fcf3e58f000)
libp11-kit.so.0 => /usr/lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007fcf3e349000)
libtasn1.so.6 => /usr/lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007fcf3e134000)
libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007fcf3df22000)
libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007fcf3dd19000)
root@f1900c42a247:/app/php5/bin# file ./php
./php: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=6a20af08f915249cb3c2ade7014de23a8eaca06f, not stripped

```
Sasasu
2016-11-02 12:52:03 +08:00
@gouchaoer
sorry 刚才只是证明了能编译出静态链接的,没想到真正有人需要这个..Orz
发完图片就去上课了,现在下课后来补全内容.
我下载的 php 版本是
pkgver=5.3.29
source=("http://www.php.net/distributions/${pkgbase%53}-${pkgver}.tar.bz2")

下载回来解压什么的...

先生成 makefile,用 LDFLAGS 给连接器传参数,让他静态链接.你要是要什么模块也在这里加上就好
./configure --enable-static --enable-shared=no --enable-cli --disable-all LDFLAGS=-static
prefix 加不加都可以,大概会影响你的配置文件放在哪里,你要是不静态连接的话会影响你的.so 文件在哪里

之后出来一大堆东西,打开 Makefile,搜索-export-dynamic 有两个.
BUILD_CLI = $(LIBTOOL) --mode=link $(CC) -export-dynamic $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) $(EXTRA_LDFLAGS_PROGRAM) $(LDFLAGS) $(PHP_RPATHS) $(PHP_GLOBAL_OBJS) $(PHP_CLI_OBJS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $(SAPI_CLI_PATH)
这里决定了只会静态链接 php 自己的库,系统库还是动态的.

删掉 -export-dynamic,在最后面加上-all-static.
之后开开心心 make -j8

如果遇到
warning: Using 'getservbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
你大概需要装 glibc 的静态链接包 (gcc 开了 pie 大概不需要?)

可以在这里下载
https://sasasu.cn/php

我在 archlinux 64bit gcc 6.2 上编译,成功在 centos 6 64bit 没装 gcc 上运行
suconghou
2016-11-02 17:19:32 +08:00
@Sasasu 测试可行,已编译完 php7,但部分扩展,xml 等 不能启用,否则总是出错.
gouchaoer
2016-11-02 18:13:37 +08:00
@suconghou 能给个 dockerfile 么,今天忙别的活儿没来得及搞,我的想法是编译一个精简的 php-cli ,非核心扩展可以自己带上 xxx.so (带上一个 php.ini 文件)需要的时候手动加
suconghou
2016-11-02 20:29:05 +08:00
@gouchaoer

docker run -it alpine sh

进入 docker 然后

apk update && apk upgrade
apk --update add xz gcc g++ make wget file openssl-dev pcre-dev zlib-dev libxml2-dev curl-dev jpeg-dev libpng-dev freetype-dev libmcrypt-dev bzip2-dev libxslt-dev
cd /tmp
PHP_VERSION=php-7.0.12
wget http://php.net/distributions/${PHP_VERSION}.tar.xz
tar xJf ${PHP_VERSION}.tar.xz
cd ${PHP_VERSION}
export CFLAGS="-O3"
./configure --enable-inline-optimization --enable-static=yes --prefix=/usr/local --with-config-file-path=/etc --without-pear --disable-cgi --disable-opcache --disable-fpm --disable-all --enable-posix --enable-pcntl --enable-sockets --enable-ftp --enable-bcmath --enable-zip --enable-mbstring --enable-gd-native-ttf --with-iconv --with-mysqli --with-pdo-mysql --with-openssl --enable-pdo --enable-exif --enable-calendar --with-bz2 --with-sqlite3 --with-pdo-sqlite --enable-phar --enable-session --enable-tokenizer --enable-hash --enable-fileinfo --enable-json --enable-shared=no LDFLAGS=-static


然后按楼上的修改 Makefile

make && make install

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/317154

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX