V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
gouchaoer
V2EX  ›  问与答

linux 上绿色版的 php 怎么弄?

  •  
  •   gouchaoer · Nov 1, 2016 · 6481 views
    This topic created in 3464 days ago, the information mentioned may be changed or developed.

    我想得到一个 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 版本研究了一下发现的确也是动态链接了许多库。。。问一下诸位可有思路?

    45 replies    2017-06-01 19:02:55 +08:00
    holyghost
        1
    holyghost  
       Nov 1, 2016   ❤️ 1
    用 python 全部重写一遍。

    一个想法,不一定对。
    mgna17
        2
    mgna17  
       Nov 1, 2016
    > 做一些琐碎的运维工作

    何苦呢。。。
    macroideal
        3
    macroideal  
       Nov 1, 2016 via iPhone
    xamp?
    LeoQ
        4
    LeoQ  
       Nov 1, 2016 via iPhone
    linux 下装 PHP 太麻烦?? Excuse me ?
    jarlyyn
        5
    jarlyyn  
       Nov 1, 2016
    docker
    gouchaoer
        6
    gouchaoer  
    OP
       Nov 1, 2016
    @holyghost 我对 php 比较熟悉, python 不太熟悉呢, shell 也是
    @LeoQ 装 php 意味着你污染了 linux 环境,而且装 php 可能出各种问题

    @jarlyyn docker 太重了啦,另外既然是干运维在容器里跑 php-cli 没用啊
    Kisesy
        7
    Kisesy  
       Nov 1, 2016   ❤️ 4
    也许可以去问一个叫 eechen 的人
    xss
        8
    xss  
       Nov 1, 2016
    你竟然不愿意安装 php 也不愿意用 docker
    那就只能自己部署一个基本的 filesystem, 里面配置好 php 的各种环境
    然后 chroot
    misaka19000
        9
    misaka19000  
       Nov 1, 2016 via Android
    @Kisesy 开源中国里面那哥们么
    kslr
        10
    kslr  
       Nov 1, 2016 via Android
    你折腾的时间,足够你学会了
    iyaozhen
        11
    iyaozhen  
       Nov 1, 2016 via Android
    这里面学问大了。百度内部 PHP 框架 ODP 就是绿色版的。自带各种常用扩展和 Nginx ,拆包即用。他们目前已经在做开源的准备了。
    tempdban
        12
    tempdban  
       Nov 1, 2016 via Android
    编译的时候加个 prefix
    参照 lnmp
    holyghost
        13
    holyghost  
       Nov 1, 2016 via iPhone
    @gouchaoer PHP 这门语言并不适合运维相关的工作,它只能拿来开发 web 应用。

    能这么做和应该这么做是两码事,不要给自己挖坑。
    helloccav
        14
    helloccav  
       Nov 1, 2016
    我也是比较熟悉 php ,所以我在 linux 上用 php 代替 shell 写一些日常维护的脚本。
    helloccav
        15
    helloccav  
       Nov 1, 2016
    @holyghost PHP 这门语言并不适合运维相关的工作,但不是不能做运维相关的工作。
    就像智能手机,拍照方面比不上单反,上网方面比不上电脑,听歌方面比不上 hifi 。但胜在方便,出门的时候不用背一台单反+一台笔记本+一台 hifi 出门。
    php 同理,很多工作它不是专业,但却能实现这些工作,即使是勉强实现,但毕竟能实现。
    你是愿意带一台手机出门呢,还是同时带笔记本和单反出门呢?
    xjp
        16
    xjp  
       Nov 1, 2016 via iPhone
    有包管理啊 怎么会污染系统
    dasenlin
        17
    dasenlin  
       Nov 1, 2016
    很久以前就有楼主想法,非常讨厌 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 ,配置个主机是分分钟的事情
    strwei
        18
    strwei  
       Nov 1, 2016
    绿色就是预编译包吧
    Sasasu
        19
    Sasasu  
       Nov 1, 2016 via Android
    config --prefix=.
    或者去改 makefile 在最后连接的时候加上 static
    ericls
        20
    ericls  
       Nov 1, 2016 via iPhone
    不是一切皆文件吗?
    msg7086
        21
    msg7086  
       Nov 2, 2016
    @helloccav 带手机出门啊。
    所以为什么放着「胜在方便」的 Python 不用,要背着沉重的 PHP 全家桶出门呢……
    qw7692336
        22
    qw7692336  
       Nov 2, 2016 via Android   ❤️ 1
    于是有了 docker
    txlty
        23
    txlty  
       Nov 2, 2016
    以前找到过一个安卓(arm)版, 5.5 的。从此可以在手机上跑 php 脚本了。但查不到源头是谁编译的。
    twl007
        24
    twl007  
       Nov 2, 2016
    @gouchaoer 我好奇的问一下装个 php 怎么会污染环境? 而且安装的时候会出现什么问题 = = ||||
    bsidb
        25
    bsidb  
       Nov 2, 2016 via Android
    docker 简直不能再合适。
    Sasasu
        26
    Sasasu  
       Nov 2, 2016

    只依赖 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
        27
    lslqtz  
       Nov 2, 2016
    @Sasasu +1
    再数数有几个非绿色版的运行库...
    Sasasu
        28
    Sasasu  
       Nov 2, 2016

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

    php -info :http://paste.ubuntu.com/23414142/
    suconghou
        29
    suconghou  
       Nov 2, 2016
    @Sasasu 能否指明需要修改的地方?
    gouchaoer
        30
    gouchaoer  
    OP
       Nov 2, 2016
    @Sasasu 你贴个 phpinfo 有啥用?
    gouchaoer
        31
    gouchaoer  
    OP
       Nov 2, 2016
    @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
        32
    wallax  
       Nov 2, 2016
    可以试试 docker+alpine 来做底包
    jasontse
        33
    jasontse  
       Nov 2, 2016 via iPad
    dotdeb 这事不就解决了么
    gouchaoer
        34
    gouchaoer  
    OP
       Nov 2, 2016
    @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
        35
    chenlongwen  
       Nov 2, 2016 via Android
    之前,安装 mcpe 服务器软件 pocketmine 的时候,官方提供的就是编译好的平台通用的。
    https://bintray.com/pocketmine/PocketMine/Unix-PHP-Binaries

    https://github.com/PocketMine/php-build-scripts
    gouchaoer
        36
    gouchaoer  
    OP
       Nov 2, 2016
    @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
        37
    Sasasu  
       Nov 2, 2016   ❤️ 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 上运行
    suconghou
        38
    suconghou  
       Nov 2, 2016
    @Sasasu 测试可行,已编译完 php7,但部分扩展,xml 等 不能启用,否则总是出错.
    gouchaoer
        39
    gouchaoer  
    OP
       Nov 2, 2016 via Android
    @suconghou 能给个 dockerfile 么,今天忙别的活儿没来得及搞,我的想法是编译一个精简的 php-cli ,非核心扩展可以自己带上 xxx.so (带上一个 php.ini 文件)需要的时候手动加
    suconghou
        40
    suconghou  
       Nov 2, 2016
    @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
    Tyanboot
        41
    Tyanboot  
    PRO
       Nov 3, 2016 via Android
    @dasenlin configure 的时候用 prefix 指定一下路径怎么会出现污染呢。而且也可以编译后打包交给包管理器= =
    Balthild
        42
    Balthild  
       Nov 3, 2016
    @Tyanboot +1 ,指定一下 --prefix=/usr/local/php/blahblah ,那安装进你系统的文件就绝不会存在于 /usr/local/php/blahblah 这个目录之外的任何地方,连 sysvinit 脚本都得你自己复制粘贴进去
    gouchaoer
        43
    gouchaoer  
    OP
       Nov 4, 2016 via Android
    @Kisesy 这个 eechen 是谁呢?我看很多人给你的回答点赞,我百度了一下的确是个人的账号,但是 github 和博客都没搜到啥东西,他对 php 有啥厉害的地方呢?
    gouchaoer
        44
    gouchaoer  
    OP
       Nov 4, 2016 via Android
    找到了这个人打包 php 的方法,不是静态编译,把动态连接库找出来一起打包,算是一个参考吧

    https://my.oschina.net/eechen/blog/411534
    gouchaoer
        45
    gouchaoer  
    OP
       Jun 1, 2017
    @chenlongwen
    pocketmine 的方法没问题,只是需要解压到 /pocketmine 目录下,我在它基础上再裁剪了一下下: https://github.com/gouchaoer/pocketmine-php70

    pocketmine 的 build 的脚步挺有用的,大家定制自己的 php 二进制可以直接在上面改
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3139 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 433ms · UTC 14:41 · PVG 22:41 · LAX 07:41 · JFK 10:41
    ♥ Do have faith in what you're doing.