写爬虫的时候不想用和nginx已配置好的环境用php来跑命令行脚本,需要安装一个和nginxapache之类的中间件没有瓜葛的独立php引擎,专门用来跑脚本的。
自动安装的依赖根据系统类型不同,命令也不同。
centos下
yum-yinstalllibxml2libxml2-developensslopenssl-develcurl-devellibjpeglibjpeg-devellibpnglibpng-develfreetypefreetype-devellibmcrypt-develpcre-develdebian/ubuntu的环境下,你需要用到apt-get命令处理一下
当然如果有人自己经常用ldapshmop,那这是个人才,小弟佩服。
运行configure搞糊涂时需
configure--help看一下。有些--with的语法已经不管用了,统统要变成--enable
./configure--prefix=/usr/local/php--with-config-file-path=/usr/local/php/etc\--with-bz2--enable-ctype--enable-filter--with-gmp--with-libxml--with-pdo-sqlite--enable-phar\--enable-exif--enable-session--enable-opcache--with-xsl\--disable-debug\--disable-rpath\--enable-mysqlnd\--with-mysqli=mysqlnd\--with-pdo-mysql=mysqlnd\--with-iconv=/usr/local\--with-zlib\--enable-xml\--enable-bcmath\--with-curl\--enable-mbregex\--enable-mbstring\--enable-intl\--enable-gd\--with-openssl\--with-mhash\--enable-pcntl\--enable-sockets\--with-zip如果报找不到iconv错误:
checkingforiconvsupport...yesconfigure:error:Pleasereinstalltheiconvlibrary.需要将--with-iconv=/usr/local改为--with-iconv
./configure--prefix=/usr/local/php--with-config-file-path=/usr/local/php/etc\--with-bz2--enable-ctype--enable-filter--with-gmp--with-libxml--enable-phar\--enable-exif--enable-session--enable-opcache--with-xsl\--disable-debug\--disable-rpath\--enable-xml\--enable-bcmath\--enable-mbregex\--enable-mbstring\--enable-intl\--enable-gd\--enable-pcntl\--enable-sockets\--enable-mysqlnd\--with-mysqli=mysqlnd\--with-pdo-mysql=mysqlnd\--with-iconv\--with-zlib\--with-curl\--with-openssl\--with-mhash\--with-zip小编把openssl改成libressl了,在libressl手动编译时,小编通过./configure--prefix=/usr/local/libressl的参数安装到了/usr/local/libressl,那么就要指定openssl的新目录
将--with-openssl改为--with-openssl=/usr/local/libressl
./configure--prefix=/usr/local/php--with-config-file-path=/usr/local/php/etc\--disable-debug\--disable-rpath\--enable-ctype\--enable-filter\--enable-phar\--enable-exif\--enable-session\--enable-opcache\--enable-mysqlnd\--enable-mbregex\--enable-mbstring\--enable-intl\--enable-gd\--enable-xml\--enable-bcmath\--enable-pcntl\--enable-sockets\--enable-soap\--with-bz2\--with-gmp\--with-libxml\--with-xsl\--with-mysqli=mysqlnd\--with-pdo-mysql=mysqlnd\--with-iconv=/usr/local\--with-zlib\--with-curl\--with-openssl=/usr/local/libressl\--with-mhash\--with-zip如果想多搞几个php.ini配置文件拆成几块,可把这一段参数--with-config-file-path=/usr/local/php/etc换成类似如下的命令
如果你不是想要单搞命令行的,想把fpm搞进去,请加一段fpm配置进去,但别忘了事先把用户建立好:
#建立用户groupaddwwwuseradd-gwww-s/sbin/nologinwww#测试用户是否正常idwww#下面是在配置php-fpm编译项的时候追加的参数--enable-fpm--with-fpm-user=www--with-fpm-group=www上述fpmuser和group自己创建的。
还是那句话,如果编译过程中libiconv报错,需要将配置参数中的--with-iconv=/usr/local改为--with-iconv
或者,在makeinstall之前添加一行试试
make&&makeinstallphp配置文件处理接下来把php.ini的推荐配置文件(你可以在php安装包里面找),拷贝到php配置目录下
cpphp.ini-production/usr/local/php/etc/php.ini如果你已经启用了fpmcd/usr/local/php/etccpphp-fpm.conf.defaultphp-fpm.confcp./php-fpm.d/www.conf.default./php-fpm.d/www.conf做个软连接假设你把php安装到了默认的位置/usr/local/php/
ln-s/usr/local/php/bin/php/usr/bin/phpfpm服务配置创建一个文件,还是假设你的php被安装到了默认的路径/usr/local/php/
vim/lib/systemd/system/php-fpm.service我们假设fpm的进程文件放在/var/run/目录下,把配置放到/usr/local/php/etc/php-fpm.conf文件里
文件内容:
[Unit]Description=ThePHP8.0FastCGIProcessManagerDocumentation=man:php-fpm8.0(8)After=network.target[Service]Type=simplePIDFile=/var/run/php-fpm.pidExecStart=/usr/local/php/sbin/php-fpm--nodaemonize--fpm-config/usr/local/php/etc/php-fpm.confExecReload=/bin/kill-USR2$MAINPID[Install]WantedBy=multi-user.targetPDO的配置默认来讲,官方包默认安装进来的php是没有pdo_mysql功能的,如果使用针对mysql的pdo一定会报错,怎么办呢
首先回到安装源目录,例如安装源你将其解压到了/root/php-7.0.29目录下,那么pdo_mysql插件会搁置在/root/php-7.0.29/ext/pdo_mysql这个路径下
再回想你安装的php7路径在哪里例如安装到了/usr/local/php7这个路径下,那么进入到/root/php-7.0.29/ext/pdo_mysql下面:
cd/root/php-7.0.29/ext/pdo_mysql/usr/local/php7/bin/phpize./configure--with-php-config=/usr/local/php7/bin/php-config--with-pdo-mysql=share当然如果你当前系统里面安装了mysql服务,你可以把上面的share改成mysql的安装路径,注意,不是说要你指向mysql的bin目录,而是安装路径,例如/usr/local/mysql这样子。
接下来,需要修改php7下面的php.ini文件,找到下面这一行:
[Pdo_mysql]在其下方增加一段:
啥玩意,编译个php还能编译出bug没错,现实就是如此,既然你选择了php,不去折腾,又如何
论头秃,php还是蛮保护同行的发量的,不要怕,上去一把梭哈!
前提条件,请你在编译前,把该准备的库都准备好,不然可能会报各种奇奇怪怪的错误,见本文开篇依赖安装
先用libiconv1.14版本打比方(本文顶部是1.17版的)
找到698行代码:
_GL_WARN_ON_USE(gets,"getsisasecurityhole-usefgetsinstead");将之改为:
#ifdefined(__GLIBC__)&&!defined(__UCLIBC__)&&!__GLIBC_PREREQ(2,16)_GL_WARN_ON_USE(gets,"getsisasecurityhole-usefgetsinstead");#endif已经安了libiconv还报错error:pleasereinstalliconv那就是检测不到libiconv了。何解头秃的事情来了。如果有人问小编这个问题,小编建议:注意编译选项当中的--with-iconv,考虑换着用以下三种参数挨个尝试:
1、--with-iconv后面什么路径都不指定
2、--with-iconv=/usr/local
3、--with-iconv=/usr/local/libiconv或者你安装过的自定义位置
因为根据上文的记述,你应该已经把libiconv库安装到了/usr/local/libiconv这个路径下了,编译器逻辑一定会找得到的。如果还是不行,据洋鬼子说,要在执行configure命令之前先输入命令:
[2021-03-0922:47UTC]guillaume-phpatouttersdoteuTomas,couldyoupleasetelluswhaterrorisloggedintheconfig.logAssuggestedbycmg,thisisaproblemofdetection;butinmycase(FreeBSD10.2,with"hand"-compiledGNUiconv1.16withoutpkgconfig),thedetectionprogramhadnoproblem,ratheritwasitscompileenvthatlackeda-liconv.Sothiscouldbecircumventedbyrunningan:exportLDFLAGS="$LDFLAGS-liconv"beforetheconfigure.I_think_that,likeyou,IhadnoproblemcompilingaPHP7inthesameenvironment(sothisdetectfailurewouldbeaconfigureregression);butIcannotbecertain.w
我测试过,有时候行,有的环境就不行。为了避免不使用容器的兄弟被恶心到,小编通过以下的写法是可以通过配置检查的
#find/-name"libssl.so"#如果找到路径为/usr/lib/x86_64-linux-gnu/libssl.so则输入以下命令ln-s/usr/lib/x86_64-linux-gnu/libssl.so/usr/liberror:off_tundefined;checkyourlibraryconfigurationvim/etc/ld.so.conf添加如下几行
/usr/local/lib64/usr/local/lib/usr/lib/usr/lib64保存退出:wq
使之生效
ldconfig-v提示configure:error:Cannotfindldaplibrariesin/usr/lib解决办法:
在网上下载一个gmp的库,下载:
apt-getinstalllibfreetype-dev然后在配置php环境的时候指定参数:
--with-freetypeOK,接着搞就ok了。这你都不会那你可就要学了,兄弟。
一般开发的时候发现是报以下错误
Calltoundefinedfunctionimagecreatefromjpeg()使用php--rigd命令发现gd是已经启用的,但gd里面没有支持jpeg的说法。怎么办?首先这种情况下,你需要重新编译php
请在debian/ubuntu系统命令里输入(有可能需要sudo)
apt-getupdate&&apt-getinstalllibjpeg-devcentos系统里
yuminstalllibjpeg-devel重启fpm
通过增加swap分区文件的方式解决1G内存小主机无法通过编译的问题:
1、检查当前的分区情况(使用free-m或cat/proc/swaps):
[root@db2root]#free-mtotalusedfreesharedbufferscachedMem:10068492201138-/+buffers/cache:35971Swap:0002、增加交换分区文件及大小:
检查没有swap,下面就需要增加:
判定新交换文件的大小,将大小乘以1024来判定块的大小。例如,大小为64MB的交换文件的块大小为65536,在shell提示下以根用户身份键入以下命令,其中的count等于想要的块大小。
[root@db2root]#ddif=/dev/zeroof=/home/swapbs=1024count=10240001024000+0recordsin1024000+0recordsout使用以下命令来设置交换文件:
[root@db2root]#mkswap/home/swapSettingupswapspaceversion1,size=1023996KiB[root@db2root]#3、启用交换分区文件:
要立即启用交换文件而不是在引导时自动启用,使用以下命令:
[root@db2root]#swapon/home/swap检查增加后的交换情况:
[root@db2root]#free-mtotalusedfreesharedbufferscachedMem:10069941204929-/+buffers/cache:60946Swap:9990999[root@db2root]#要在引导时启用,编辑/etc/fstab文件来包含以下行
(/home/swapswapswapdefaults00):
[root@db2root]#vi/etc/fstabLABEL=//ext3defaults11LABEL=/boot/bootext2defaults12/home/swapswapswapdefaults00none/dev/ptsdevptsgid=5,mode=62000none/procprocdefaults00none/dev/shmtmpfsdefaults00LABEL=/usr/usrext3defaults12/dev/sda5swapswapdefaults00/dev/cdrom/mnt/cdromiso9660noauto,owner,kudzu,ro00/dev/fd0/mnt/floppyautonoauto,owner,kudzu00/home/swapswapswapdefaults00系统下次引导时,它就会启用新建的交换文件
再次检查添加后的情况:
[root@db2oracledb]#free-mtotalusedfreesharedbufferscachedMem:10069792706917-/+buffers/cache:54952Swap:9990999[root@db2oracledb]#关于减少docker镜像体积之编译后清理无用库目前韩天峰发布的swoole-cli,本人还是处于观望状态。
如果是把如此大规模的编译成果,连同关联的lib都塞进容器里显然是很大的,这就涉及到了容器编排,说来话长,如果只是想简单粗暴本地交付一下单镜像呢这里拿debian/ubuntu的镜像举例:
aptautoremovepkg-configmakecmakeg++gccwgetmanpagesm4ca-certificatesaptclean以上命令只是粗暴地删除,有一些成对出现的同名库,名字后面多一个-dev/-devel的是开发库,可以删掉,只保留一个。个别插件的开发库没办法删除。删了php就会报错。
另外把/usr/share/doc和/var/log下的日志和文档删干净
节约点硬盘,php小版本升级需要重新编译的时候再拉。
小编发现明明在配置文件php.ini里已经写好了
enable.opache=1但实际检查没有启用opcache呢?
原来是少了个配置
zend_extension="opache.so"另外建议加上opcache的jit配置
opcache.jit=1255opcache.jit_buffer_size=256M如果已经在用swoole代替php-fpm了还需要用opcache吗?答案是不用。
网上有公子哥说opcache+jit生命周期300秒的php-fpm和swoole性能差不多。可能这位小哥没实现到数据库连接池,或者没开swoole协程特性。