Centos6.5下安装httpd搭配php实验
作者:Aliot
发布时间:2019-08-28
评论:0
阅读:3
关于apxs必须要知道的:
apxs是apache下的一个模块编译工具,一般apache是不具备二次开发,只有在安装了该工具之后,才能进行二次开发,比如编译php的so文件等(为apache安装php采用源码安装时,需要调用apxs这个模块进行编译).所以需要安装apache的开发包httpd-devel。实验过程中由于私自删除了apxs这个文件,导致了php无法进行编译安装(./configure命令的参数 --with-apxs=xx项无法起作用)。于是先卸载httpd-devel(原来安装有,只不过被我删除了apxs文件,导致无法工作了),重新安装yum install httpd-devel安装,然后就出现了/usr/sbin/apxs(注意这是一个文件不是目录)。
php的安装实验:
1. 下载php5.6源码包编译安装,进入目录下直接执行:
./configure
make &&
make install
成功安装php5.6,执行 php -v 命令可以正常显示php版本号。
2. 配置httpd.conf,想加入 LoadModule libphp5.so,结果发现,httpd安装目录下的modules文件夹不存在libphp5.so,php的安装目录下也不存在该文件,执行
find / -name
*php5.so
全目录查找该文件也未找到,后来才发现没有生成。经过检查,发现在执行./congigure命令时,只有添加了 --with-apxs=/xxx/xxx 参数才会生成该文件。
搜索apxs找不到,经过百度,这个东西要另外安装httpd-devel才会出现。于是执行yum install httpd-devel,成功找到apxs,在/usr/sbin/apxs(注:这是个文件,不是目录哦),于是尝试删除php(yum remove php, rpm -e php都运行了,发现php -v还可以正常显示php版本号,目测不知道怎么卸载php!!无语)。重新配置php,并重新编译生成,两个重要参数设置如下
./confgigure
--prefix=/usr/local/php --with-apxs=/usr/sbin/apxs
然后出现错误:
Error:You have enabled apache 1.3 support
while your server is apache 2,please use the appropriate switch.
检查发现--with-apxs是针对apache1.x的,--with-apxs2才是针对apache2的,于是修改参数如下
./confgigure
--prefix=/usr/local/php --with-apxs2=/usr/sbin/apxs
然后执行 make
&& make install
安装成功(重要说明:安装php的过程中为了获得mysql的支持还需要configure更多的参数,参见后面遇到的mysql的坑。另外后期使用php的过程中遇到了生成验证码所需的gd库的freetype自由字体没安装的坑,目前仍然没有解决,只是跳过了,configure步骤决定了生成的php是否能支持apache,mysql,gd库等各种各样的功能,因此根据自己的需求确定要开启什么模块,事先规划好才是明智的)
生成libphp5.so在/usr/local/php5.6/libs目录下,cp命令复制到/etc/httpd/modules下,如果/etc/httpd/conf.d/php.conf没有ifmodules指明要加载的libphp5.so的位置,那么就需要在httpd.conf文件里加入以下配置:
LoadModule
php5_module modules/libphp5.so
重启httd(service httpd restart),访问php ok, nice!!
这里我们需要搞清楚以下几个东西的关系:
1. httpd和httpd-devel,httpd-devel是apache的开发包,php的安装需要该开发包的支持(apxs)
2. httpd和php的关系:
httpd只能输出静态html,php代码需要php模块单独解析,httpd跟php的关系有几种,cgi, cli, sapi……
总结:
因为不清楚各个事物的关系,所以进行了许多错误的实践,耗费了许多精力,又是一次低效的实践过程。还是得静下心来弄清楚关系再实验。
2019-08-19 php不支持mysql连接的各种坑
执行php的mysqli_connect方法:
$conn =
mysqli_connect("localhost","root","","helper");
报错:
PHP Warning: mysqli_connect(): No such
file or directory
查找发现网络统一说是php的mysqli.default_socket没有配置,php找不到mysql的socket连接文件导致(如果mysql没有启动也会提示这个信息)。于是查找mysql安装目录的mysql.sock文件位置:/var/lib/mysql/mysql.sock,设置到/etc/php.ini下。错误仍旧。
查看phpinfo发现Loaded Configuration File项为none,php没有成功加载php.ini文件。于是安装 yum install strace 追踪插件,发现php加载的php.ini的位置是 /usr/local/lib(注:原以为php.ini的位置应该是Configuration File (php.ini)
Path 项设置的目录,该值为/etc/php,php.ini原来也放在/etc/php/目录下),于是把php.ini复制到 /usr/local/lib目录下,php终于成功加载php.ini。
把localhost换127.0.0.1或192的ip,则提示permission deny(难道是grant PRIVELEGES不正确?)。无语,找到所有php相关文件删除,重新编译php,复制libphp5.so文件到 /etc/httpd/modules,用IP连接仍然提示没有权限,改回localhost提示连接成功!!!!!
总结:php单独安装编译时,./configure的参数尤其重要,尽量不要缺失设置项,否则后面可能出现各种错误,示例:
Mysql Native Driver本地驱动,简称:mysqlnd,在PHP5.3.0版本中被引入,PHP5.4之后的版本mysqlnd被作为默认配置选项。
php5.3以后的写法如下:(新版调用php自己写的驱动)
./configure --prefix=/usr/local/php
--with-apxs2=/usr/sbin/apxs --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd
--with-mysqli=mysqlnd
php5.3以前的写法如下:(旧版本调用mysql开发的驱动)
./configure --prefix=/usr/local/php
--with-apxs2=/usr/sbin/apxs --with-mysql=/usr/local/mysql
--with-pdo-mysql=/usr/local/mysql
--with-mysqli=/usr/local/mysql/bin/mysql_config
发现:当php.ini加载错了的时候,不知道如何超找php.ini的准确位置,该如何确定php.ini的位置?????另,strace插件对于追踪php内部错误有一点作用。示例用法: strace -T /phpinfo.php > /php.log
上面的意思是执行phpinfo.php文件,生成的日志到php.log下,方便查看。
接下来遇到的问题:
1. 验证码无法显示。检查发现是少了freetype(这个东西允许php生成验证码的时候调用自定义的字体),日志提示 call to undefined
function imagettftext().
鼓捣了半天仍然无法安装这个鬼东西,单独去编译gd库仍然不能正常工作,又不想去重新编译整个php,难道每次开启模块都要重新编译php?最后决定弃用freetype,用imagestring代替,该方法无法调用自定义字体,对freetype没有依赖。
2. 登录时提示验证码不正确,查看日志发现session无法正常工作了,检查发现php.ini配置的session.save_path的文件夹不存在,于是在 /var/lib/php/下面建立session文件夹,然后chmod 777 session,赋予读写权限,session正常了。