免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8492 | 回复: 4
打印 上一主题 下一主题

apache2.4.1+php5.3.10、php5.4.0使用碰到的一系列问题,请大家注意,再次修改 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-12 10:14 |只看该作者 |倒序浏览
本帖最后由 chlinux 于 2013-02-16 15:32 编辑

安装方法,我只提一下关键点,网上能找到相关文档,我不啰嗦
1、安装apache2.4.1
卸载:
yum remove apr apr-util httpd
下载安装:
apr-1.4.6.tar.gz
./configure --prefix=/usr/local/apr-httpd/ && make && make install
下载安装:
apr-util-1.4.1.tar.gz
./configure --prefix=/usr/local/apr-util-httpd/ --with-apr=/usr/local/apr-httpd/ && make && make install
下载安装:
httpd-2.4.1.tar.gz
./configure  --prefix=/usr/local/apache241 --enable-mods-shared=all --enable-deflate --enable-speling --enable-cache --enable-file-cache --enable-disk-cache --enable-mem-cache --enable-ssl --with-ssl=/usr/local/openssl/ --enable-rewrite --enable-so --with-apr=/usr/local/apr-httpd/ --with-apr-util=/usr/local/apr-util-httpd/

2、安装php5.3.10和php5.4.0是一样的
php-5.4.0.tar.gz
./configure --prefix=/usr/local/php540 --with-gd --with-zlib-dir --with-freetype-dir --with-mysql --with-apxs2=/usr/local/apache241/bin/apxs --enable-mbstring --with-mcrypt --with-curl --with-iconv --enable-soap --with-openssl --enable-zip

3、安装phpredis模块,这个安装大家要注意一下了,php5.3.10是正常安装没什么问题的,但这个模拟本身的问题编译会出错,我反馈给phpredis官方,没想到很快给出了结果,更新的源码,但改完后估计他们也没有测试,还有两个源码文件没有修改,编译还会出错,可以模仿着手工修改一下。
这个是官方的修改

正常安装,php5.3.10可以正常配置安装
下载地址:https://github.com/nicolasff/phpredis,有个图标zip点这个下载。
cd phpredis
/usr/local/php540/bin/phpize
./configure --with-php-config=/usr/local/php540/bin/php-config
make
make install
make install后,会把redis.so拷到扩展目录下。如下:

记得php5.3.10是这个路径
php5.3.10/lib/php/extensions/no-debug-zts-20090626/

下面显示的是5.4.0的目录,5.3.10和这个类似,在make install时注意一下就行了,当然也可以在phpinfo()中查到这个目录。

[root@data nicolasff-phpredis-9577b82]# make install
Installing shared extensions:     /usr/local/php540/lib/php/extensions/no-debug-zts-20100525/
[root@data nicolasff-phpredis-9577b82]# ll /usr/local/php540/lib/php/extensions/no-debug-zts-20100525/
total 660
-rwxr-xr-x 1 root root 671271 Mar 12 09:42 redis.so


修改php.ini文件
extension_dir = "/usr/local/php540/lib/php/extensions/no-debug-zts-20100525/"
extension=redis.so

重启apache就可以在phpinfo信息中看到下面的信息了
Redis Version         2.1.3

对于php5.4.0需要做些修改,昨天他们刚修改了redis.c这个文件,但还落下两个,模仿修改一下即可编译通过。其余操作和php5.3.10一样处理。


  1. redis.c View file @ f8c8ab2
  2. +#if PHP_VERSION_ID >= 50400
  3.          518       
  4. +  id = zend_list_insert(redis_sock, le_redis_sock TSRMLS_CC);
  5.          519       
  6. +#else

  7. vi redis_array.c
  8. id = zend_list_insert(ra, le_redis_array TSRMLS_CC); //+TSRMLS_CC

  9. vi redis_array_impl.c
  10. id = zend_list_insert(redis_sock, le_redis_sock TSRMLS_CC); //

复制代码
现在开始说一下我从php5.2.17过渡到5.3.10碰到的问题:
1、date函数使用前需要使用这个函数做一下设置,当然这个可以在php.ini中进行配置。

   date_default_timezone_set('Asia/Shanghai');

2、很惭愧一个低级错误用php5.2.17一直顺利的在运行,但php5.3.10、php5.4.0都能正确的报错:
   public static public static function myfunction_name(){}

3、sessionid的自动传递问题,有些应用不得以要用url来传递sessionid,但php5.3.10让我难堪了一下,搞了一天才顺序使用:
   php5.2.17的代码:
  1. ini_set ( 'session.name', 'sid' );
  2. ini_set ( 'session.use_cookies', 0 );
  3. ini_set ( 'session.use_trans_sid', 1 );
  4. session_start ();
复制代码
但在php5.3.10还需要再配置一个参数
  1. ini_set ( 'session.use_cookies', 0 );
  2. ini_set ( 'session.use_only_cookies', 0 );
  3. ini_set ( 'session.name', 'sid' );
  4. ini_set ( 'session.use_trans_sid', 1 );
  5. session_start ();
复制代码
基本问题解决后说一下apache2.4.1的配置,这个和我之前用的apache2.0配置有些变化
1、需要哪些模块,自已来配置httpd.conf来载入
2、配置文件不全堆在httpd.conf,如虚拟主机的配置文件
在httpd.conf中配置
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
然后修改:
extra/httpd-vhosts.conf
比较实用的一个配置
<VirtualHost *:80>
    DocumentRoot "/www/vhost1"
    ServerName www.test.com
    ErrorLog "|/usr/local/sbin/cronolog /usr/local/apache241/logs/%Y/%m/%d/errors.log"
    CustomLog "|/usr/local/sbin/cronolog /usr/local/apache241/logs/%Y/%m/%d/access.log" combined
</VirtualHost>

用这个配置需要安装cronolog-1.6.2.tar.gz,这个版本可能比较老了

另外需要按自己的要求来配置日志文件的格式:
但这个需要载入一个模块:
LoadModule logio_module modules/mod_logio.so
然后配置
    <IfModule logio_module>
      # by xxx
      LogFormat "%P\t%h\t%{%Y-%m-%d %T}t\t%r\t%>s\t%b\t%{Referer}i\t%{User-Agent}i\t%{X-Forwarded-For}i" combined
    </IfModule>

这里我提一下我的一点经验
%P,这个记录执行某程序的进程编号.
说一下记录这个进程id号的作用:如果你程序有问题了,又很难定位,那么你可以先查看top动态参数,查看哪个进程占用的资源多,记录这个进程的id然后再去查日志,这样就容易定位到某个程序了,当然一个进程会处理很多任务,你可以配置一下让一个进程尽量少执行些任务就死掉。
正常运行时配置
MaxRequestsPerChild  5000
调试时配置
MaxRequestsPerChild  10

这是我引以自豪的一个设置希望能给大家提供帮助!

apache2.4.1可能是线程化了,具体情况我说不清楚了,从下面的命令结果可以看出问题,当然你也可以在编译安装apache时在configure中进行配置。

apachectl  -l

Compiled in modules:
  core.c
  mod_so.c
  http_core.c
  event.c

注意这里是
event.c
不是
prefork.c


redis存储session的一点分享,下面这段代码的功能:
1、多台web服务器可以通过一台或者多台主从redis服务器存取session
2、通过url传递sessionid,当然,可以通过cookie来传递sessionid但注意不要修改cookie的相关配置

  1. ini_set ( 'session.name', 'sid' ); //这个可改成自己随意定义
  2. ini_set ( 'session.use_cookies', 0 );  
  3. ini_set ( 'session.use_only_cookies', 0 );   //这个配置php5.4以前是不需要的
  4. ini_set ( 'session.use_trans_sid', 1 );  //通过url传参数
  5. ini_set ( 'url_rewriter.tags', "a=href,area=href,frame=src,input=src,form=fakeentry,go=href" );  //go=href,是我自己要用到的
  6. ini_set ( 'session.save_handler', 'redis' );  //存储到redis服务器,事先安装好redis模块
  7. ini_set ( 'arg_separator.output', "&amp;" );  //链接中的 & 用 &amp;代替,这在xml子集的标记语言中适用。
  8. session_save_path ( "tcp://192.168.0.1:6379?timeout=2.5" );   //存储路径,根据实际情况修改
复制代码
还真冷清,害我白折腾这么长时间啊,好事做到底,接着写一下

补充:htmlspecialchars函数的使用请注意默认字符集的改变:php5.4.0默认是ISO-8859-1,php5.4.0默认改为:UTF-8,这个千万要注意!
手册原文是这样说的:
http://cn2.php.net/manual/en/function.htmlspecialchars.php
string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] )
Defines encoding used in conversion. If omitted, the default value for this argument is ISO-8859-1 in versions of PHP prior to 5.4.0, and UTF-8 from PHP 5.4.0 onwards.

我再把我今天碰到的情况和大家说一下,这个函数是支持GB2312字符集的,但不支持GBK及GB18030,但这会让你很是郁闷!

看一下这个说明:
GB2312有6763个汉字,GBK有21003个汉字,GB18030-2000有27533个汉字,GB18030-2005有70244个汉字。

也就是说,如果你用GB2312那么你碰到GB2312以外的字符那htmlspecialchars 函数会返回空,注意,不是别的乱码之类的,是空!

一段代码可用来测试,这是我实际碰到的可能你想举个反例还不容易找到这个字的!
  1. <?php
  2. $str = "啰";
  3. echo htmlspecialchars($str,ENT_XML1,"GB2312");
  4. ?>
复制代码
这段代码返回的结果是空!

那是不是说这个函数就没办法使用了呢?那也不是的,像下面这样处理就OK了:
  1. <?php
  2. $str = "啰";
  3. $str = mb_convert_encoding($str,"UTF-8","GB18030"); //或者GBK,但不可以是GB2312,原因:超范围了,啰这个字GB2312里没有
  4. echo htmlspecialchars($str,ENT_XML1,"UTF-8");  当然你要输出GBK那用mb_convert_encoding再转回去
  5. ?>
复制代码
再强调一下mb_convert_encoding支持哪些字符集?一定要查手册,不同的版本手册上的说明真还不一样,查手册是个好习惯,尤其是换了版本后,php5.2换到php5.3一定要注意,如果用php5.4更要查手册的!!!
http://cn2.php.net/manual/en/mbstring.supported-encodings.php

这个是最新版本的手册。

评分

参与人数 1可用积分 +10 收起 理由
bs + 10 总结

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2012-03-14 12:26 |只看该作者
本帖最后由 hfyete 于 2012-03-14 12:28 编辑

非常感谢,另外我安装的httpd2.4.1+php5.4.0,安装好之后无法打开页面,请教一下原因

论坛徽章:
0
3 [报告]
发表于 2012-03-14 17:03 |只看该作者
本帖最后由 chlinux 于 2012-03-14 17:04 编辑

回复 2# hfyete


    你这么说我也不清楚你当时的情况啊,呵呵,服务是否启动,防火墙是否设置正确?

查80端口命令:
lsof -i:80

查防火墙配置情况:
iptables -L

论坛徽章:
0
4 [报告]
发表于 2012-04-24 15:36 |只看该作者
/redis.c: In function ‘send_discard_static’:
/redis.c:299: error: ‘tsrm_ls’ undeclared (first use in this function)
/redis.c:299: error: (Each undeclared identifier is reported only once
/redis.c:299: error: for each function it appears in.)
我编译过程中报这个错误,怎么解决啊?

论坛徽章:
0
5 [报告]
发表于 2012-07-03 18:14 |只看该作者
那个APR去哪下载啊 我在apache.org没找到啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP