我想得到一个 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 版本研究了一下发现的确也是动态链接了许多库。。。问一下诸位可有思路?
1
holyghost 2016-11-01 17:20:46 +08:00 1
用 python 全部重写一遍。
一个想法,不一定对。 |
2
mgna17 2016-11-01 17:31:37 +08:00
> 做一些琐碎的运维工作
何苦呢。。。 |
3
macroideal 2016-11-01 17:38:29 +08:00 via iPhone
xamp?
|
4
LeoQ 2016-11-01 17:39:37 +08:00 via iPhone
linux 下装 PHP 太麻烦?? Excuse me ?
|
5
jarlyyn 2016-11-01 17:39:44 +08:00
docker
|
6
gouchaoer OP |
7
Kisesy 2016-11-01 18:09:19 +08:00 4
也许可以去问一个叫 eechen 的人
|
8
xss 2016-11-01 18:11:37 +08:00
你竟然不愿意安装 php 也不愿意用 docker
那就只能自己部署一个基本的 filesystem, 里面配置好 php 的各种环境 然后 chroot |
9
misaka19000 2016-11-01 18:36:42 +08:00 via Android
@Kisesy 开源中国里面那哥们么
|
10
kslr 2016-11-01 18:55:09 +08:00 via Android
你折腾的时间,足够你学会了
|
11
iyaozhen 2016-11-01 18:58:03 +08:00 via Android
这里面学问大了。百度内部 PHP 框架 ODP 就是绿色版的。自带各种常用扩展和 Nginx ,拆包即用。他们目前已经在做开源的准备了。
|
12
tempdban 2016-11-01 19:01:58 +08:00 via Android
编译的时候加个 prefix
参照 lnmp |
13
holyghost 2016-11-01 20:51:08 +08:00 via iPhone
|
14
helloccav 2016-11-01 21:23:42 +08:00
我也是比较熟悉 php ,所以我在 linux 上用 php 代替 shell 写一些日常维护的脚本。
|
15
helloccav 2016-11-01 21:27:50 +08:00
@holyghost PHP 这门语言并不适合运维相关的工作,但不是不能做运维相关的工作。
就像智能手机,拍照方面比不上单反,上网方面比不上电脑,听歌方面比不上 hifi 。但胜在方便,出门的时候不用背一台单反+一台笔记本+一台 hifi 出门。 php 同理,很多工作它不是专业,但却能实现这些工作,即使是勉强实现,但毕竟能实现。 你是愿意带一台手机出门呢,还是同时带笔记本和单反出门呢? |
16
xjp 2016-11-01 21:31:37 +08:00 via iPhone
有包管理啊 怎么会污染系统
|
17
dasenlin 2016-11-01 22:30:13 +08:00
很久以前就有楼主想法,非常讨厌 linux 下的各种安装包,各种依赖,因为 linux 做不到像 ios 系统那样可以完全删除应用,会残留各种污染。 linux 上绿色版的 php 肯定有,但需求的不多,开源开发这方面肯定不多,不像 win 的各个软件可以绿色一下。
win 系统只安装了输入法跟绿色软件必须的几个 C++库 http://p1.bqimg.com/4851/9ca430b04826add4.png 其他一律是绿色的放到 D 盘,做一个放快捷方式的文件夹,就算新装个系统,无需安装打开即运行,你无法想象这么多软件重装系统后安装原版的安装文件是多么浪费生命的事情。 http://p1.bqimg.com/4851/9ca430b04826add4.png 如果 linux 也出个绿色版的 php nginx ,配置个主机是分分钟的事情 |
18
strwei 2016-11-01 22:31:44 +08:00
绿色就是预编译包吧
|
19
Sasasu 2016-11-01 23:15:11 +08:00 via Android
config --prefix=.
或者去改 makefile 在最后连接的时候加上 static |
20
ericls 2016-11-01 23:25:01 +08:00 via iPhone
不是一切皆文件吗?
|
21
msg7086 2016-11-02 01:44:19 +08:00
@helloccav 带手机出门啊。
所以为什么放着「胜在方便」的 Python 不用,要背着沉重的 PHP 全家桶出门呢…… |
22
qw7692336 2016-11-02 02:32:48 +08:00 via Android 1
于是有了 docker
|
23
txlty 2016-11-02 02:32:56 +08:00
以前找到过一个安卓(arm)版, 5.5 的。从此可以在手机上跑 php 脚本了。但查不到源头是谁编译的。
|
25
bsidb 2016-11-02 07:58:55 +08:00 via Android
docker 简直不能再合适。
|
26
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 吧.. |
28
Sasasu 2016-11-02 09:18:53 +08:00
|
31
gouchaoer OP @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# ``` |
32
wallax 2016-11-02 11:48:49 +08:00
可以试试 docker+alpine 来做底包
|
33
jasontse 2016-11-02 11:49:39 +08:00 via iPad
dotdeb 这事不就解决了么
|
34
gouchaoer OP @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 啊 |
35
chenlongwen 2016-11-02 12:27:39 +08:00 via Android
之前,安装 mcpe 服务器软件 pocketmine 的时候,官方提供的就是编译好的平台通用的。
https://bintray.com/pocketmine/PocketMine/Unix-PHP-Binaries https://github.com/PocketMine/php-build-scripts |
36
gouchaoer OP @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 ``` |
37
Sasasu 2016-11-02 12:52:03 +08:00 2
@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 上运行 |
39
gouchaoer OP |
40
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 |
41
Tyanboot 2016-11-03 08:20:48 +08:00 via Android
@dasenlin configure 的时候用 prefix 指定一下路径怎么会出现污染呢。而且也可以编译后打包交给包管理器= =
|
42
Balthild 2016-11-03 15:58:02 +08:00
@Tyanboot +1 ,指定一下 --prefix=/usr/local/php/blahblah ,那安装进你系统的文件就绝不会存在于 /usr/local/php/blahblah 这个目录之外的任何地方,连 sysvinit 脚本都得你自己复制粘贴进去
|
43
gouchaoer OP @Kisesy 这个 eechen 是谁呢?我看很多人给你的回答点赞,我百度了一下的确是个人的账号,但是 github 和博客都没搜到啥东西,他对 php 有啥厉害的地方呢?
|
44
gouchaoer OP |
45
gouchaoer OP @chenlongwen
pocketmine 的方法没问题,只是需要解压到 /pocketmine 目录下,我在它基础上再裁剪了一下下: https://github.com/gouchaoer/pocketmine-php70 pocketmine 的 build 的脚步挺有用的,大家定制自己的 php 二进制可以直接在上面改 |