设为首页收藏本站
开启辅助访问

创星网络[分享知识 传递快乐]

 找回密码
 立即注册

QQ登录

只需一步,快速开始

用新浪微博登录

只需一步,快速搞定

搜索

编译安装apache2.4.1+php5.3.10、php5.4.0使用碰到的一系列问题

2012-8-7 22:07| 发布者: cryinglily| 查看: 617| 评论: 0|原作者: luinstein

摘要: 安装方法,我只提一下关键点,网上能找到相关文档,我不啰嗦 1、安装apache2.4.1 卸载: yum remove apr apr-util httpd 下载安装: apr-1.4.6.tar.gz ./configure --prefix=/usr/local/apr-httpd/ make make ins ...
安装方法,我只提一下关键点,网上能找到相关文档,我不啰嗦
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 wap.kanshu.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', "&" );  //链接中的 & 用 &代替,这在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 函数会返回空,注意,不是别的乱码之类的,是空!

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

这段代码返回的结果是空!

那是不是说这个函数就没办法使用了呢?那也不是的,像下面这样处理就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

这个是最新版本的手册。

from:http://bbs.chinaunix.net/thread-3682363-1-1.html


鲜花

握手

雷人

路过

鸡蛋

相关分类

QQ|Archiver|手机版|小黑屋|创星网络 ( 苏ICP备11027519号|网站地图  

GMT+8, 2025-2-23 00:44 , Processed in 0.053364 second(s), 16 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

返回顶部