标签归档:PHP

如何高效的获取远程图片的长宽、格式、文件大小

最近在做一个图片抓取系统,其中有一个地方是需要用到获取远程图片的长宽,大小,和格式信息;不过一提到获取这样的信息,那么脑海里马上就会浮现 getimagesize() 这个函数,但是,在真正用到的时候才发现,这个函数很笨,效率很低,一方面是它会把这个图片直接下载下来,然后再获取其中的信息,而我们又知道,下载东西,CURL肯定是迅猛无比的;那么能不能把这两者结合起来呢~

但是问题又出现了,如果我用CURL的方式,就不太容易获取图片长宽信息了,不够方便,于是乎我就翻阅了文档中和图片有关的函数,就找到了这么一个getimagesizefromstring(),刚好符合我的要求!于是乎你只需要下面这个函数就可以比较高效的获取啦!

public function get_remote_filesize($url){
       $ch = curl_init ();
       curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, 'GET' );
       curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );
       curl_setopt ( $ch, CURLOPT_URL, $url );
       ob_start ();
       curl_exec ( $ch );
       $return_content = ob_get_contents ();
       ob_end_clean ();
       $return_code = curl_getinfo ( $ch, CURLINFO_HTTP_CODE );
       $len = floatval( round(strlen($return_content)/1024/1024,2) );
       echo $len;
       var_dump(getimagesizefromstring($return_content));
}

说点别的,其实获取远程图片信息有很多种方法,比如file_get_content(),比如使用get_header(),获取页面头中的信息来判定图片,但如果对方服务器不允许获取header信息,那就不行了。所以相比而下依旧是CURL效率最快,而且CURL可以模拟各种请求,高效而强大,在批量下载文档,或者图片之类的,CURL方法仍是首选。

Laravel 添加 Oracle 数据库常驻连接( DRCP )

由于以前一直接触的是互联网业务,所以使用 Mysql 数据库的比较多,也比较熟悉。但是现有的金融公司一般使用的都是比较稳定的 Oracle 解决方案,所以在用户量较大的情况下会遇到一个比较麻烦的问题:Oracle 下的高并发。

问题描述:由于同时访问某个应用的用户量非常大;导致后端不断查询数据库,虽然每个 sql 语句的查询时间很短,但是由于要不断的连接->查询->断开,所以Oracle服务器会发现很多的查询进程,一个接一个,由于每个sql执行的时候,服务器会分配一些资源和内存给这个查询,所以在并发非常大的时候,悲剧就产生了,CPU和内存的使用率马上被推上峰值,负载马上压到最大,然后所有的 sql 查询全部变慢,变慢导致的后果是,应用服务器下的 Apache 进程时间越来越长,由于用户还在不断的查询,所以后面进入的apache进程会一直处于等待状态,而正在执行的进程缺越来越慢,果不其然的是很快,应用服务器马上也被拖垮。

解决方案:实际上这样的情况有很多方法优化,此处就着重描述一下在有限的服务器资源的状况下引入的一个数据库驻留连接池的特性,当然,这个特性 JAVA 已经自带了,而 PHP 需要修改一些配置,也可以使用。

数据库驻留连接池是 Oracle Database 11g 的一个新特性。对 PHP,它允许 Web 应用程序随着站点吞吐量的增长对连接数进行扩充。它还支持多台计算机上的多个 Apache 进程共享一个小规模的数据库服务器进程池。没有 DRCP,标准 PHP 连接必须启动和终止一个服务器进程。一个非 DRCP 持久性连接即使空闲时也将保留数据库服务器资源。

那么如何如何在不编写和更改任何应用程序逻辑的情况下使用这个DRCP呢?

一定要做的步骤:
要在 Oracle 中启用 DRCP,登录到数据库服务器并启动连接池:

SQL> execute dbms_connection_pool.start_pool();
PL/SQL procedure successfully completed.

通过查询特定的 DBA_CPOOL_INFO 视图确认该池已启动:

QL> SELECT CONNECTION_POOL, STATUS, MAXSIZE
  2  FROM DBA_CPOOL_INFO;

CONNECTION_POOL             STATUS		    MAXSIZE
----------------------------------------------------------
SYS_DEFAULT_CONNECTION_POOL ACTIVE		    40

OK,启动成功!接下来就是PHP的设置:
首先,打开你的php.ini文件找到

oci8.connection_class = MYPHPAPP

取消注释,起个名字;
由于这次使用的是laravel框架,所以接下来就不详细描述原生 PHP 的使用方法了(基本使用方法请猛戳这篇文章),直接进入框架使用。想要连接 Oracle 数据库,你需要安装 jfelder/laravel-oracledb 插件,代码和安装方法请猛戳这里 。安装完成了之后,你只需要找到下面这个文件

D:\work\www\baiqian_fqg\baiqian_bqfqg_wx\vendor\jfelder\oracledb\src\Jfelder\OracleDB\Connectors\OracleConnector.php

然后在这个文件中的这段代码:

(CONNECT_DATA =  (SID = {$config['database']})

中加上 (SERVER = POOLED) ,变成如下代码:

(CONNECT_DATA = (SERVER = POOLED) (SID = {$config['database']})

此举是为了声明在连接到数据库服务器的时候使用常驻池连接
接着找到这个文件

D:\work\www\baiqian_fqg\baiqian_bqfqg_wx\vendor\jfelder\oracledb\src\Jfelder\OracleDB\OCI_PDO\OCI.php

在文件中找到这段代码

    protected $attributes = array(\PDO::ATTR_AUTOCOMMIT => 1,
        \PDO::ATTR_ERRMODE => 0,
        \PDO::ATTR_CASE => 0,
        \PDO::ATTR_ORACLE_NULLS => 0
    );

此代码中加入 \PDO::ATTR_PERSISTENT => 1, 变成如下代码

    protected $attributes = array(\PDO::ATTR_AUTOCOMMIT => 1,
        \PDO::ATTR_ERRMODE => 0,
        \PDO::ATTR_CASE => 0,
        \PDO::ATTR_ORACLE_NULLS => 0,
        \PDO::ATTR_PERSISTENT => 1,
    );

此举是为了开启长连接,也可以让它默认使用oci_pconnect()函数来做为基本连接函数。
到此为止,全部更改和设置均已完成,接下来我们可以看看效果:
使用Apache自带的Apache Benchmark小工具来做个压力测试,命令如下:

ab -c 150 -t 30 http://test.php   

Apache Benchmark的介绍和用法以及参数请猛戳这里,然后使用如下语句来查询Oracle的进程数,会发现,使用常驻连接池之后比使用之前少了很多。

select username, program from v$session where username = 'PHPHOL';

(本文描述较为粗略,有一些步骤省略掉了,不过可以借此机会来涨一涨姿势,我就不啰嗦了。)

参考文档和连接:
Oracle官方文档:
http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/oow10/php_db/php_db.htm#s1
Oracle官方文档(中文版)http://www.oracle.com/technetwork/cn/tutorials/229068-zhs.htm
基础使用:http://mo2g.com/view/38/
Apache Benchmark:http://blog.fabrichina.net/archives/250
laravel-oracledb:https://github.com/jfelder/laravel-oracledb

 

记一次小故障

网站后台有一个上传文件的程序,今天产品突然找到我说是不能使用了。我试了试,发现点击完上传按钮之后,老是跳转到链接被重置的页面,如下:

立马在本地查看了一下源代码,最开始的反应是文件upload_max_filesize小了或者是post_max_size的默认设置小了,查看了配置文件之后发现没什么问题,最大子好吃80M,而这个文件才23M,问题到底出在哪呢?然后前端分析了一下,发现这个提醒:

结果发现没什么用处。就再此时我突然想了一下有没有可能是后端的错误,比如是不是网络问题,服务器的空间大小问题等等,就在此时,我换了个浏览器重现了一遍错误,发现如下提醒:

413 Request Entity Too Large
The requested resource does not allow request data with the requested method or th
e amount of data provided in the request exceeds the capacity limit.

猛然想起,除了程序限制,还有NGINX限制,于是找运维,果然,限制最大为20M,改为50M,问题解决。

简单的PHP导入csv文件并解决中文为空 / 中文乱码问题

工作中有时候会遇到会把一些excel表格插入到数据库(这里是mysql)中的场景,这里有比较简单的解决方案,就是先把这个表格另存为csv格式,然后用PHP程序中的fgetcsv函数来读取。

代码如下:

function getcsv(){
    $file = fopen("1.csv","r");//文件位置
    while(! feof($file)){
        $row = _fgetcsv($file);
        echo $row['0']." | ".$row['1']." | ".$row['2'] ." | ".$row['3'] ."\r\n";//每个下标对应一列
    }
    fclose($file);
}

然后呢,就会发生一个奇怪的问题:文件中的中文要么变成了乱码,要么压根就读不出来,经过查阅,这里算是这个函数的一个小小的bug,那么,此时我们只需要重写一下这个函数就好了,如下:

 function _fgetcsv(&$handle, $length = null, $d = ',', $e = '"') {
         $d = preg_quote($d);
         $e = preg_quote($e);
         $_line = "";
         $eof=false;
         while ($eof != true) {
             $_line .= (empty ($length) ? fgets($handle) : fgets($handle, $length));
             $itemcnt = preg_match_all('/' . $e . '/', $_line, $dummy);
             if ($itemcnt % 2 == 0)
                 $eof = true;
         }
         $_csv_line = preg_replace('/(?: |[ ])?$/', $d, trim($_line));
         $_csv_pattern = '/(' . $e . '[^' . $e . ']*(?:' . $e . $e . '[^' . $e . ']*)*' . $e . '|[^' . $d . ']*)' . $d . '/';
         preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
         $_csv_data = $_csv_matches[1];
         for ($_csv_i = 0; $_csv_i < count($_csv_data); $_csv_i++) {
             $_csv_data[$_csv_i] = preg_replace('/^' . $e . '(.*)' . $e . '$/s', '$1' , $_csv_data[$_csv_i]);
             $_csv_data[$_csv_i] = str_replace($e . $e, $e, $_csv_data[$_csv_i]);
         }
         return empty ($_line) ? false : $_csv_data;
    }

然后把getcsv这个函数中的fgetcsv替换为自定义的_fgetcsv就可以了。

参考内容:http://php.net/manual/zh/function.fgetcsv.php

这些日子遇到的令人难过的BUG

最近一直都是在做还算精细的字符串处理,但是有遇到一些当时花费了好久才都没解决但是最后发现是一个php的bug的事情~

1、strtotime的BUG

在用strtotime(‘-x month’),函数往前推月份的时候,有时候会出现月份不准的情况;这是PHP的一个官方BUG,详情见此:https://bugs.php.net/bug.php?id=27793

尤其是如果涉及到的月份是31天或者是28,29天就很容易跑偏,比如:

<?php
date_default_timezone_set('Asia/Shanghai');
$t = time();
print_r(array(
            date('Y年m月',$t),
            date('Y年m月',strtotime('- 1 month',$t)),
            date('Y年m月',strtotime('- 2 month',$t)),
));

你想要的结果是这样子:

Array
(
    [0] => 2011年08月
    [1] => 2011年07月
    [2] => 2011年06月
)

但是结果却是这样子:

Array
(
    [0] => 2011年08月
    [1] => 2011年07月
    [2] => 2011年07月
)

是不是很恼火(当时就为这个推算花了一下午折腾,哭),那么解决方法呢?获取需要知道月份的第一天的时间就可以了;

代码如下:

<?php
date_default_timezone_set('Asia/Shanghai');
$first_day_of_month = date('Y-m',time()) . '-01 00:00:01';
$t = strtotime($first_day_of_month);
print_r(array(
            date('Y年m月',$t),
            date('Y年m月',strtotime('- 1 month',$t)),
            date('Y年m月',strtotime('- 2 month',$t)),
));

输出

Array
(
    [0] => 2011年08月
    [1] => 2011年07月
    [2] => 2011年06月
)

2、大小写转换函数strtolower();strtoupper()

这个是在处理验证码的时候发现的;其实这个不算是一个BUG,是一个字符编码的问题,通常验证码输入是不分大小写的,所以需要函数转换一下即可,但是不知道为什么在我本地环境是没什么问题的,上传到服务器就会发现和session里面的验证码对比不准确的奇怪事情,有时候相等有时候不相等,思来想去本地和服务器唯一不同的就是环境了,服务器是linux的,于是我当下就查阅了一下,发现一个官方的BUG:https://bugs.php.net/bug.php?id=19257 但是这个貌似不是我遇到的问题;那还有不一样的是PHP的版本,于是有查阅了,还有个版本不一样和字符集不一样的问题:

在 PHP Version 4.3.2 中,`测试`==strtolower(‘测试’)
在 PHP Version 4.3.4 中,`测试`!=strtolower(‘测试’)

然后经过查阅问题的原因是本地字符集不是中文而导致的。如果是linux系统,你只要:

export LANG=zh_CN.GB18030

就可以了。

好吧,我不管这些了;直接说最后的解决方案吧:好的就是 strncasecmp() 你没跑了,二进制安全比较字符串开头的若干个字符,自定义长度就好了;验证码就指着这个活了。

3、字符串截取函数:substr()

可能有人问了,这么基础的函数也尼玛有BUG ?

擦,真有,昨天在处理字符串的时候,需要取出一个二进制数字从右往左数的第十六位,看看是否为“1”,问题来了:因为二进制是十进制转换来的,有一些数字专函过来之后是没有十六位的,那么在window下默认就是为“0”了,但是放到linux上面就不是了,放到linux下的话,如果没有到第十六位的话它获取的字符就是最左边的那个数字,比如这样:

$action = '1000000000';//(转换为二进制之后的)
var_dump (substr($action, -16, 1) );

在本地window输出为”bool(false)”,但是放到linux下就输出为string(1) “1″ ,快哭了好么,就这个也折腾了不少时间;

但是字符还是要取出来啊,怎么办,写一个函数解决吧,翻转一下字符串正着数总好了吧:

function getbit($num, $bit) {
    $num = decbin ( $num );
     $num = strrev ( $num );
     if (substr ( $num, ($bit - 1), 1 )) {
         return 1;
     } else {
         return 0;
     }
}

参考资料:

  1. http://spamer.iteye.com/blog/1162625
  2. http://bbs.csdn.net/topics/60020464
  3. https://bugs.php.net/bug.php?id=27793
  4. https://bugs.php.net/bug.php?id=19257

PHP传值与传引用的区别

其实关于传值还是传引用这个东西,可以把它当做深入的PHP知识来看待,可以当做初学必知来看待,尤其是初学者在PHP面试当中一定会遇到的面试题之一;其实一开始我也是不明白的,直到我在搜索的过程中发现了一个绝妙的比喻(原文见末尾链接):

『   传值:跟copy是一样的。打个比方,我有一橦房子,我给你建筑材料,你建了一个根我的房子一模一样的房子,你在你的房子做什么事都不会影响到我,我在我的房子里做什么事也不会影响到你,彼此独立。

传引用:让我想起了上大学时学习C语言的指针了,感觉差不多。打个比方,我有一橦房子,我给你一把钥匙,我们二个都可以进入这个房子,你在房子做什么都会影响到我。』

先看看两者的定义:

按值传递:函数范围内对值的任何改变在函数外部都会被忽略;仅将对象的值传递给目标对象,说白了就相当于copy;系统将为目标对象重新开辟一个完全相同的内存空间。

按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改,也就是说真正的以地址的方式传递参数传递以后,行参和实参都是同一个对象,只是他们名字不同而已对行参的修改将影响实参的值。

1,传值:

<?php
 $param1=1; //定义变量1
 $param2=2; //定义变量2
 $param2 = $param1; //变量1赋值给变量2
 echo $param2; //显示为1
 ?>

2,传引用:

<?php
 $param2=1; //定义变量2
 $param1 = &$param2; //将变量2的引用传给变量1
 echo $param2; //显示为1
 $param1 = 2; //把2赋值给变量1
 echo $param2; //显示为2
 ?>

3,函数传值:

<?php
 //传值
 $param1 = 1; //定义变量1
 function add($param2) //传参数
 {
 $param2=3; //把3赋值给变量2
 }
 $param3=add($param1); //调用方法add,并将变量1传给变量2
 echo '<br>$param1=='.$param1.'<br>'; //显示为$param1==1
 echo '<br>$param2=='.$param2.'<br>'; //显示为$param2== 因为$param2是局部变量,所以不能影响全局
 echo '<br>$param3=='.$param3.'<br>'; //显示为$param3== 因为add方法没有返回值,所以$param3为空
 ?>

4,函数传引用:

<?php
 //传值
 $param1 = 1; //定义变量1
 function add(&$param2) //传参数
 {
 $param2=3; //把3赋值给变量2
 // return $param2; //返回变量2
 }
 echo '<br>$param1=='.$param1.'<br>'; //显示为$param1==1 没对变量1进行操作
 $param3=add($param1); //调用方法add,并将变量1的引用传给变量2
 echo '<br>$param1=='.$param1.'<br>'; //显示为$param1==3 调用变量过程中,$param2的改变影响变量1,虽然没有return
 echo '<br>$param2=='.$param2.'<br>'; //显示为$param2== 因为$param2局部变量,所以不能影响全局
 echo '<br>$param3=='.$param3.'<br>'; //显示为$param3== 如果把方法里面的return注释去掉的话就为$param3==3
 ?>

5,函数传引用2

<?php
//传引用
 $param1 = 1;
 function &add(&$param2)
 {
 $param2 = 2;
 return $param2;
 }
 $param3=&add($param1);
 $param4=add($param1);
 echo '<br>$param3=='.$param3.'<br>'; //显示为$param3==2
 echo '<br>$param4=='.$param4.'<br>'; //显示为$param4==2
 echo '<br>$param1=='.$param1.'<br>'; //显示为$param1==2 调用变量过程中,$param2的改变影响变量1
$param3++;
/*下面显示为$param1==3,这是因为$param2和$param1引用到同一个地方,
 * 返回值前面加了地址符号还是一个引用$param3=&add($param1);
 * 这样$param3,$param2和$param1引用到同一个地方,当$param3++;时,
 * $param1会被改变*/
 echo '<br>$param1=='.$param1.'<br>';
$param4++;
 /* 下面显示为$param1==3,这里为什么是3而不是4呢,这是因为返回值前面没有
 * 地址符号,它不是一个引用所以当$param4改变时不会影响$param1*/
 echo '<br>$param1=='.$param1.'<br>';
 ?>

关于运行速度:

其实在少量数据的情况下其实并没有什么太大的影响,但是数据量很大的情况下按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。

参考链接 :

5个php实例,细致说明传值与传引用的区别

案例解析PHP中传值、传引用

PHP传值和传引用、传地址的区别

如何在LEMP服务下安装phpmyadmin

关于phpmydmin

phpmyadmin是一款以PHP为基础,以Web-Base方式架构在网站服务器上的MySQL的数据库管理工具,让管理者可用Web介面管理MySQL数据库。在安装phpmyadmin之前,一定要确保您的服务器上面安装了LEMP 或者是LAMP等服务,这样才能确保phpmyadmin能正常安装以及运行,等安装完WEB服务之后,你就可以开始安装phpmyadmin了。

第一个步骤:安装phpmyadmin

开始使用apt-get来下载并安装它

sudo apt-get install phpmyadmin

在安装过程中,phpmyadmin会问你需不需要配置数据库,选择是。然后还会出现一个选择,就是提示你选择一个服务器:Apache或lighttpd的,随意选择其中一个即可。

第二个步骤:配置phpmyadmin

此时此刻,虽然已经把phpmyadmin安装到服务器当中了,但是,还需要多一部来配置它;phpMyAdmin和您的网站的目录之间需要创建一个链接。如果你正在看前面的步骤,它可能仍位于nginx的默认目录,否则就无法使用:

sudo ln -s /usr/share/phpmyadmin/ /usr/share/nginx/www

重启nginx

sudo service nginx restart

然后就可以访问你的网址:http://xxxxxxxx/phpmyadmin
注意:会有一些意想不到的情况
有可能当你访问了phpmyadmin之后发现,会出现首页空白的情况,不要慌,打开PHP.ini打开错误提示,看看是不是配置错误,若不是配置错误的话可以尝试一下先卸载phpmyadmin,是卸载,不是删除,然后在重新安装一次,期间需要重启nginx服务。

还有需要注意的地方是:第二个步骤,最好是用ln这个命令来做一个链接,不要直接复制phpmyadmin文件夹到nginx的网站目录下。

参考链接:How to Install phpMyAdmin on a LEMP server

如何安装Linux,nginx,Mysql,PHP(LEMP) 于 Ubuntu

关于LEMP

LEMP是一组运行在WEB服务器上面的开源软件,是Linux,nginx(由于英文发音中其实是Engine x,所以首字母为E),MysqlPHP的首字母缩写,由于服务器已经运行Ubuntu,也就是说Linux部分已经安装完成,这里就教大家如何安装剩下的服务。

关于设置

在本教程的步骤中需要用户有ROOT权限。你可以在初始服务器安装教程中的步骤34中看到如何设置。

第一个步骤:Step One—Update Apt-Get

在这个教程当中,我们将会使用apt-get来进行服务器程序安装,在2012年的58PHP被发现严重的漏洞,重要的是我们需要下载最新的补丁来保护我们的服务器。

让我们来做一次更新吧:

sudo apt-get update

第二个步骤:安装Mysql

Mysql是一个强大的用于组织和管理检索数据的数据库管理系统。

安装先打开终端,输入这些命令:

sudo apt-get install mysql-server libapache2-mod-auth-mysql php5-mysql

在安装的过程中,Mysql会要求你设置root密码。如果你在安装的时候错过来设置密码的机会,没关系,在安装完成后也是非常容易设置的。

一旦你安装来Mysql,我们要用这个命令激活它:

sudo mysql_install_db

最后通过运行MySQL建立脚本:

sudo /usr/bin/mysql_secure_installation

然后会提示你输入当前的跟密码,然后输入它

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

然后提示会问你,如果你想更改根密码,选择“N”到下一个步骤

这是最简单的应答所有的选项,最后,将会重新加载和执行Mysql的新变化

By default, a MySQL installation has an anonymous user, allowing anyone

to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y                                            
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
... Success!

By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

完成了之后你就可以完成安装“PHP”

第三个步骤:安装NGINX

一旦安装好来Mysql,我们就可以在VPS上面安装NGINX

sudo apt-get install nginx

nginx不是自动启动的,想要让nginx运行,输入命令

sudo service nginx start

您可以确认您的WEB服务器上面已经安装了nginx,您可以通过浏览器输入您的IP地址,你可以运行以下命令来显示您的VPSIP地址。(若在本地安装此步骤可以酌情省下)

ifconfig eth0 | grep inet | awk '{ print $2 }'

第四个步骤:安装PHP

安装PHP,先要打开终端,输入以下命令,下一步,我们将设置nginxphp的详细配置

sudo apt-get install php5-fpm

第五个步骤:配置PHP

我们需要对PHP配置文件做一点小小的改动,打开php.ini

sudo nano /etc/php5/fpm/php.ini

找到这一行:“ cgi.fix_pathinfo=1” a并且把1 改为 0

cgi.fix_pathinfo=0

如果这个数字保持为“1”,那么,PHP解释器就会尽其所能的处理文件尽可能靠近可能请求的文件。这是一个可能的安全风险。如果这个数字为“0”,相反,解释器只会处理精确的文件路径并且更加安全。保存并且退出。

我们需要对PHP5- fpm配置文件做一点小小的改动,打开www.conf

sudo nano /etc/php5/fpm/pool.d/www.conf

找到这一行“ listen = 127.0.0.1:9000,”a然后把“127.0.0.1:9000”改为“ /var/run/php5-fpm.sock“

listen = /var/run/php5-fpm.sock

保存并且退出。

重启php-fpm:

sudo service php5-fpm restart

第六个步骤:配置nginx

打开默认的虚拟主机文件

sudo nano /etc/nginx/sites-available/default

配置的变化应包括如下(细节上的变化是根据配置信息):

更新:Ubuntu的新版本默认创建一个称为‘HTML’,而不是‘www’的默认目录。如果/ usr /share/ nginx/ WWW不存在,它可能称为HTML。请确保您更新您的配置是否正确(一致即可)。

 [...]

server {
        listen   80;

        root /usr/share/nginx/www;
        index index.php index.html index.htm;

        server_name example.com;

        location / {
                try_files $uri $uri/ /index.html;
        }

        error_page 404 /404.html;

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
              root /usr/share/nginx/www;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        location ~ \.php$ {
                #fastcgi_pass 127.0.0.1:9000;
                # With php5-fpm:
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;

        }

}
[...]

这里有一些细节的变化:

添加index.php文件到索引行。

从本地主机服务器名更改你的域名或IP地址(在配置替换example.com

更改争取的行“location ~ \.php$ {“ 的一部分

保存然后推出

第七个步骤:创建一个PHP详细信息页

我们可以很快看到新的PHP配置的细节。
要对此进行设置,首先创建一个新的文件:

sudo nano /usr/share/nginx/www/info.php

键入以下代码在文件中:

<php? phpinfo(); ?>

保存然后退出,重启NGINX

sudo service nginx restart

现在你可以看到nginxPHP-FPM配置的详细信息,请访问http://youripaddress/info.php

现在您的LEMP服务已经配置到你呢的服务器上面了。

关于更多

安装完 LEMP之后, 您可以安装 WordPress,继续做更多的MySQL (一个基本的MySQL 教程) 或者安装 phpMyAdmin, 创建一个 SSL Certificate,证书,或者安装一个FTP Serverftp服务器.

参考文章:How to Install Linux, nginx, MySQL, PHP (LEMP) stack on Ubuntu 12.04

CI框架实现基本的文件上传

接着CI框架实现基本的数据库操作这一篇的说,这些其实初学者都很容易弄懂的,因为数据库就是什么增删添改。

所以这一篇来说说上一篇被注释了的部分:文件上传!

这一回先说视图层好了:

在上一篇刚才的qa.php文件里面的代码:

    <form action="insert" method="post" enctype="multipart/form-data">
         标题:<input type="text" name="question" /><br />
         内容:<input type="text" name="answer" /><br />
         图片:<input type="file" name="image" /><br />
         <input type="submit" value="提交" />
    </form>

这个表单一定要记者enctype=”multipart/form-data”这个东东,没了它一定无法上传,切记切记;

然后是修改页面的视图代码:

	<form action="<?php echo "updata"?>" method="post" enctype="multipart/form-data">
		 标题:<input type="text" name="question" /><br />
		 内容:<input type="text" name="answer" /><br />
		 图片:<input type="file" name="image" /><br />
		 <input type="submit" value="提交" />
		 <input type="text" name="id" value="<?php echo "$id"?>" />
	</form>

注意action

然后就是在上一篇的控制器feadmin.php加上文件上传类:

	//文件上传
	function fileUp(){
		$config['upload_path'] = './upload/img';
		$config['allowed_types'] = 'gif|jpg|png';//文件类型
		$config['max_size'] = '0';
		$config['encrypt_name'] = true;
		$this->load->library('upload',$config);
		if ($this->upload->do_upload('image')) {
			$upload_data = $this->upload->data();
			return $upload_data['file_name'];
		}
	}

就是这个它可以实现文件上传,

在插入的时候代码

	//插入
	function insert() {
		$_POST['image'] = $this->fileUp();
		$data=array(
				'question'=>$_POST['question'],
				'answer'=>$_POST['answer'],
				'img'=>$_POST['image'],
		);
		$this->fe_model->insert($data);
		redirect('feadmin/look','refresh');
	}

注意开头的那句$this->fileUp();它就是用那个文件上传类,搞定你要传过来的图片。

然后就是有修改了:是修改,不是修改查询

	//修改
	function updata(){
		$_POST['image'] = $this->fileUp();

		$id = $this->input->post('id');
		$this->db->where('id',$id);
		$query= $this->db->get('yanzhengma');
		$row = $query->row_array();
		if($row['img'] != "")
		{
			$file_path = 'upload/img/'.$row['img'];//获取路径
			unlink($file_path);//删除图片
		}
		$_POST['image'] = $this->fileUp();
		$sel = array(
				'question'=>$_POST['question'],
				'answer'=>$_POST['answer'],
				'img'=>$_POST['image'],
		);
		if(!empty($id) && (count($sel)>1)){///判断id值是否传过来并且判断封装的数组是否有元素存在
			$this->db->where('id',$id);
			$this->db->update('yanzhengma',$sel);
		};
		redirect('feadmin/look','refresh');
	}

依旧是加上了一个unlink()删掉之前的文件。

然后就是和插入一个道理,只不过MYSQL语句换为UPDATE罢了。

代码什么的,戳这里下载,两篇文章可能写的很粗浅,代码也都很简单,但是必须从简单开始,省的一口吃个大胖子出错多。

 

CI框架实现基本的数据库操作

凡是学什么东西就要从头学起,哪怕是一个小小的功能也必须要写出来,不要怕别人看见,即使写的很臃肿,或者是很难看,也没关系,这些都是你成长必须的,这些日子重新捡起来CI框架了,这个是比较适合初学者学习的框架,因为它的分层非常的明确,我的一个好基友用的是Yii,他对CI也非常熟悉,他说Yii基本都可以自己生成一些东西,没必要那么麻烦;其实吧,框架乃至于任何代码都是一种工具,至于如何使用,就看你自己的技巧人品和造化。

其实关于模型和控制器,看你如何写,如何用,你也可以全部都在模型里面把数据全部读取,也可以只在其中一个,我们主管说,反正三层呢,能少用一层是一层,于是乎:

控制器来了,在controllers文件夹下新建feadmin.php:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

这个东东是必须的,如果没有的话,会出现一些莫名其妙的问题;然后接下来:

class Feadmin extends CI_Controller{
	function __construct(){
		parent::__construct();
		$this->load->database();
		$this->load->model('fe_model');
		$this->load->helper('url');
	}

身为一个初学者的话一定要多看手册,关于类名和文件名必须相同什么的这样的超级低级错误,一定要小心;然后就是查看:

//查看
	public function look(){
		$query = $this->fe_model->get();
		$get['qalist'] = $query->result_array();
		$this->load->view('qa',$get);
	}

手册里面说了不推荐驼峰命名法,于是下划线就变成一个很好用的东西;接下来插入:

	//插入
	function insert() {
		//$_POST['image'] = $this->fileUp();
		echo $_POST['question'];
		echo $_POST['image'];
		$data=array(
				'question'=>$_POST['question'],
				'answer'=>$_POST['answer'],
				'img'=>$_POST['image'],
		);
		$this->fe_model->insert($data);
		redirect('feadmin/look','refresh');
	}

里面有一个FileUP()函数,是一个文件上传类,所以这句话可以不要先,然后是删除:

//删除
	function delete(){
		$id = $this->input->get('id');
		$this->db->where('id',$id);
		$query= $this->db->get('yanzhengma');
		$row = $query->row_array();
		//echo $row['img'];
		//if($row['img'] != "")
		//{
		//	$file_path = 'upload/img/'.$row['img'];//获取路径
		//	unlink($file_path);//删除图片
		//}
		$this->db->where('id',$id);
		$this->db->delete('yanzhengma');
		redirect('feadmin/look','refresh');
	}

上面我注释掉的那几行代码呢,在下一篇文章会说到,关于简单的文件上传什么的。接下来是查询修改,注意是查询修改哦,不是修改,就是只是把你要修改的数据查询出来

//查询修改
	function select_updata(){
		$sel['id'] = $this->input->get('id');
		$this->load->view('qa_up',$sel);
	}

这里才是真正的修改:

	//修改
	function updata(){
		$_POST['image'] = $this->fileUp();
		$id = $this->input->post('id');
		$this->db->where('id',$id);
		$query= $this->db->get('yanzhengma');
		$row = $query->row_array();
		//if($row['img'] != "")
		//{
		//	$file_path = 'upload/img/'.$row['img'];//获取路径
		//	unlink($file_path);//删除图片
		//}
		//echo $_POST['image'];
		$_POST['image'] = $this->fileUp();
		//echo $_POST['image'];
		$sel = array(
				'question'=>$_POST['question'],
				'answer'=>$_POST['answer'],
				'img'=>$_POST['image'],
		);
		if(!empty($id) && (count($sel)>1)){///判断id值是否传过来并且判断封装的数组是否有元素存在
			$this->db->where('id',$id);
			$this->db->update('yanzhengma',$sel);
		};
		redirect('feadmin/look','refresh');
	}

依旧照例的呢,上面注释的那部分内容是用来删除图片什么的,如果木有图片什么的,可以无视掉。
是不是要到模型了?没关系,这个暂时没有用到模型,其实把上面的代码里面的DB的部分换到模型,其实一样可以用。
终于到视图层了:在view文件夹下新建qa.php:

<body>
	<table > 
	<?php foreach ($qalist as $i): ?>
		<tr  style="text-align:left;" >  
			<td><?php echo $i['id'] ;?></td> 
			<td><?php echo $i['img'] ;?></td> 
			<td><?php echo $i['question'] ;?></td> 
			<td><?php echo $i['answer'] ;?></td>
			<td>
				<a href="<?php echo "select_updata" ?>?id=<?php echo $i['id']?>">修改</a> |
                <a href="<?php echo "delete" ?>?id=<?php echo $i['id']?>">删除</a>
			</td> 
	<?php endforeach; ?>

		<table>

	<form action="insert" method="post" enctype="multipart/form-data">
		 标题:<input type="text" name="question" /><br />
		 内容:<input type="text" name="answer" /><br />
		 图片:<input type="file" name="image" /><br />
		 <input type="submit" value="提交" />
	</form>
</body>

恩,没错,添加的表单和查看的,都在这里。
然后是修改的视图,在view文件夹下新建qa_up.php

<body>
	<form action="<?php echo "updata"?>" method="post" enctype="multipart/form-data">
		 标题:<input type="text" name="question" /><br />
		 内容:<input type="text" name="answer" /><br />
		 图片:<input type="file" name="image" /><br />
		 <input type="submit" value="提交" />
		 <input type="text" name="id" value="<?php echo "$id"?>" />
	</form>
</body>

然后就可以输入http://localhost/test/index.php/feadmin/look 自己去闹一闹了。
待会下一篇把文件上传的东东和代码补上去。

解决方案的理念

之前做的一个项目,需要一个解决方案,大致上就是要无缝加载和切换页面,怎么才能最快速的加载完成页面,最好是要做到零延迟,或者是说感官上的零延迟,着实费了一番头脑来想。所以最终的解决方案是使用JS的DOM事件对象来直接替换部分需要重写的代码即可,说白一点,就是所有页面全部写在同一个文件里面,同样,页面所有的元素都只需要加载一次即可,也包括类似于比较大的图片之类的文件,也就是说第一次加载完成,后续的直接用JS调用替换就行,也就相当于在本地执行,所以算是解决了这些个方法。

最开始在想需求的时候设想是需要加载很多页面的,但没想到的是,在硬件状况不理想的情况下,会有如此之大的差别,这也告诫我在以后的项目当中需要注意的事情,在预先我还没有想到的情况下,不能盲目动手;而且,在提高单个页面的加载速度的话,有一些思路可以,一种是划分,也就是分割成非常多非常多的同时加载,还有就是在一开头全部加载完成,需要一个稍微长时间的进度条,随后加载完成之后就可以实现无缝加载;显然项目需要的是后者。

所以具体到这个项目的实施来看,要用到大量的JS,首先,需要一个规定成为动作(可以命名为Action)的JS文档,它包括了你需要使用的一些JS操作的基本,比如,写入,更改样式,更改文本,显示,隐藏,加载,等等一些动作;然后第二个JS文件,定义了哪些文件需要的单个操作(Dom),比如,我需要隐藏的某个DIV,或者是某个模块,还有也要把显示的内容放进去,比如基础文本,比如模块的样式;第三个文件就是属于调用了,就是大量的ID穿梭的文件把内容填充进去(Content);这样把三个需要绕来绕去的都剥离出来,可扩展性就很强了,也算是体现了面向对象的一点点点点的小思想。

所以思想要咸鱼行动,解决一件事情的时候,先别动手,想好思路在开动,要不然会在后面一定会需要大量的的Bug与Debug循环。

windows2003手动配置apache+php+Mysql+phpMyAdmin完全教程

最近一直在折腾服务器配置,怎么在windows2003操作系统下手动配置apache+php+mysql+phpMyAdmin,因为需要修改的配置文件很多,所以很多人容易在其中出错误,我也是,折腾了我好几天,终于今天把这个东西配置好了。有一些小细节的东西真的很难掌控,所以我在这里尽量把所有的可能出现的问题和我自己出现的问题都在里面说一下,以免碰到更多的问题。
好的,废话不多说了,直接进入安装开始吧,安装的时候照着步骤一步一步来,不要着急,慌张也没用,看完步骤之后我会在后面列出一般会出现的问题,慌慌张张的配置好很容易出现问题的;淡定一点好。
首先在各大官方网站上面下载好apache、php、mysql、phpMyAdmin,然后放到手边上备用。
Apache 的安装
1 点击apahce安装包

2 接受协议

3 下面3项随便填即可
apache 监听80 端口.如果iis用了80端口,修改iis端口或者apache端口,以免冲突

4 这里默认的是 typical,建议选custom,点击next.

5 这里可用修改安装路径,注意安装路径不能含中文.

6 点击install开始安装

7 安装完成后在浏览器里打入 http://localhost 或者 http://127.0.0.1
如果可以看到这个页面,证明apache安装成功,已经可以解释静态页面了

MySQL 的安装
1 点击MySQL安装包

2 默认是Typical,如果想修改安装路径的话也可以选择custom.
注意:安装mysql的路径中,不能含有中文!

3 点击intall开始安装

4 跳过注册

5 是否现在就配置 MySQL.也可以之后在开始菜单的configuration wizard 进行配置.
这里是现在进行配置

6 选择Detailed Configuration(详细设置),点Next继续

7 下面这个选项是选择mysql应用于何种类型,第一种是开发服务器,将只用尽量少的内存,第二种是普通WEB服务器,将使用中等数量内存,最后一种是这台服务器上面只运行MySQL数据库,将占用全部的内存.用户可根据自己的需求,选择选项.这里只选择开发服务器,点Next继续

8 下面是选择数据库用途,第一种是多功能用途,将把数据库优化成很好的innodb(事务)存储类型和高效率的myisam(非事务)存储类型,第二种是只用于事务处理类型,最好的优化innodb,但同时也支持myisam,只有myisam才支持全文索引最后一种是简单的网络开发,适合于简单的应用,只有不支持事务的myisam类型是被支持的.一般选择第一种多功能的.

9 下面是选择InnodDB的数据存放位置,一般默认好了,不需要改动(如果要修改数据保存路径,也可用在安装后修改my.ini的datadir的值)

10 下面是选择MySQL允许的最大连接数,第一种是最大20个连接并发数,第二种是最大550个并发连接数,最后 一种是自定义,你可以根据自己的需要选择.这里选择第一个

11 下面是是否运行网络链接.这里选择复选框.数据库监听的端口,一般默认是3306,如果改成其他端口,以后连接数据库的时候都要记住修改的端口,否则不能连接mysql数据库,比较麻烦,这里不做修改,用mysq的默认端口:3306

12 这一步设置mysql的默认编码,默认是latin1,也是标准的编码.第二种是UTF8,第三种是手动设置.编码是版本4.1以上引入的.如果要用原来数据库的数据,最好能确定原来数据库用的是什么编码,如果这里设置的编码和原来数据库数据的编码不一致,在使用的时候可能会出现乱码.建议使用latin1标准编码

13 这一步是是否要把mysql设置成windows的服务,一般选择设成服务,这样以后就可以通过服务中启动和关闭mysql数据库了.推荐:下面的复选框也勾选上,这样,在cmd模式下,不必非到mysql的bin目录下执行命令.在命令行下咨询可以执行文件

14 这一步是设置mysql的超级用户密码,这个超级用户非常重要,对mysql拥有全部的权限,请设置好并牢记超级用户的密码,
下面有个复选框是表示创建一个匿名账号,这会使数据库系统不安全.如果有这个需求,也请勾选.

15 点击 Execute进行安装

16 点击finish完成安装

如果在第15步,出现下图提示

是因为你之前装过mysql.卸载时还保留了一些配置文件.
点击retry看看是否可以通过。否则点击 cancel 退出.然后点击开始菜单的 MySQL Server Instance Config Wizard
重新配置 mysql
重复之前的操作.第14步将会出现界面是像下面这样

有三个输入密码的地方,你原来装过mysql.
你在第一个文本框输入原来root的密码,后面两个文本框输入root的新密码就可以了
如果还是不行那就重装一次MySQL。
重装注意事项:最好删除原来的所有文件,必要的话,可以清一下注册表,
如果你机器上没有其它mysql相关的程序.而且一定记得不要保留原有的my.ini文件.
还有就是删除原来安装路径下的文件,并删除数据目录下面的ibdata1文件.

PHP 的安装

由于php是一个zip文件(非install版),安装较为简单
解压就行.把解压的 php-5.2.1-Win32 重命名为 php5.并复制到C盘目录下.即安装路径为 c:\php5

1 找到php目录下的 php.ini.recommended (或者php.ini-dist)文件,重命名为 php.ini并复制到系统盘的windows目录下(以c:\windows为例).

2 再把php目录下的php5ts.dll,libmysql.dll复制到目录 c:\windows\system32下.

3 把php5\ext目录下的php_gd2.dll,php_mysql.dll,php_mbstring.dll文件复制到c:\windows\system32下注意:不要把 php_mysql.dll 和 php_mssql.dll 混淆如果没有加载 php_gd2.dll php将不能处理图像.没有加载php_mysql.dll php将不支持mysql函数库php_mbstring.dll在后面使用phpmyadmin时支持宽字符

配置php并关联MySQL

打开c:\windows\php.ini文件
1 设置扩展路径
查找 extension_dir 有这么一行
extension_dir = “./”
将此行改成
extension_dir = “C:\php5\ext”
其中C:\php5是你安装php的路径.路径不正确将无法加载dll
(注意:有些php版本是 ;extension_dir = “./” 要把前面的分号去掉)

2 分别查找
;extension=php_mbstring.dll
;extension=php_gd2.dll
;extension=php_mysql.dll
把上面3项前面的分号去掉,这样apache启动时就可以加载这些dll了
注意不要把 ;extension=php_mysql.dl 和 ;extension=php_mssql.dl 混淆
当然前面我们也把这些dll复制到system32下了.(大家在安装的过程中都注意到如何把一些dll加载入来了.
以后要加载一些dll,比如说php_mysqli.dll,也就懂得怎么加载了)

3 设置会话保存路径
查找session.save_path 有这么一行
; session.save_path = “N;/path”
在此行后加入一行(注意是加入一行,不是加到后面)
session.save_path = “C:\WINDOWS\Temp”
保存到你的临时目录下,这里完全可以保存到windows临时目录Temp下

4 还有比较值得注意的是 short_open_tag .有一些php版本默认是Off的.也就是说 php不能使用短标记如 必须使用由于短标记使用方便,并且很多程序也是用短短标记来写,如discuz等,如果不把 short_open_tag 改成On将出现的症状将很难判断是上面原因,这里建议修改

查找
short_open_tag = Off
改为
short_open_tag = On

5 是否显示错误 display_errors
出于安全性考虑,display_errors 有些版本也默认为 Off.就是说在调试时,如果php代码有误,就只出现一个空白页.而不会显示出错原因和出错行数.这样调试起来将非常不便,建议根据自己需要修改
查找
display_errors = Off (注意不是 ; – display_errors = Off [Security])
改成
display_errors = On

6 显示NOTICE敬告提示
第五步虽然打开了出错提示,但出错报告还受到 error_reporting 的控制.php5默认关闭NOTICE敬告提示,如果是在本地调试,建议打开NOTICE敬告提示.
查找
error_reporting = E_ALL
改成
error_reporting = 7

另外提示一下,在程序中也可以通过error_reporting()控制错误报告输出,具体怎么用大家参考下手册.

7 register_globals
出于安全性考虑它默认也是Off
当register_globals=Off的时候,下一个程序接收的时候应该用$_POST['user_name']和$_POST['user_pass'])
当register_globals=On的时候,下一个程序可以直接使用$user_name和$user_pass来接受值.
建议根据自己需要修改,为了兼容问题,我还是把它改成On了.

8 php5时差问题
时间相差八小时
为什么呢?PHP5系列版本新增了时区设置,默认为格林威治时间,与中国所在的东8区正好相差8个小时
查找date.timezone有这么一行
;date.timezone =
将;去掉,改成
date.timezone = PRC
其中PRC:People’s Republic of China 中华人民共和国,

9 php5上传文件问题
a. 一般的文件上传,除非文件很小.就像一个5M的文件,很可能要超过一分钟才能上传完.
但在php中,默认的该页最久执行时间为 30 秒.就是说超过30秒,该脚本就停止执行.
这就导致出现 无法打开网页的情况.这时我们可以修改 max_execution_time

在php.ini里查找
max_execution_time
默认是30秒.改为
max_execution_time = 0
0表示没有限制

另一种方法是可以在php程序中加入
set_time_limit();
来设定页面最久执行时间.
set_time_limit(0);//0表示没有限制

b. 修改 post_max_size 设定 POST 数据所允许的最大大小。此设定也影响到文件上传。
php默认的post_max_size 为2M.如果 POST 数据尺寸大于 post_max_size $_POST 和 $_FILES superglobals 便会为空.
查找 post_max_size .改为
post_max_size = 150M

c. 很多人都会改了第二步.但上传文件时最大仍然为 8M.
为什么呢.我们还要改一个参数upload_max_filesize 表示所上传的文件的最大大小。
查找upload_max_filesize,默认为8M改为
upload_max_filesize = 100M

另外要说明的是,post_max_size 大于 upload_max_filesize 为佳.

Apache整合PHP

1 打开apache配置文档,以作者的电脑为例:D:\myphp\apache2.2\conf\httpd.conf

2 修改网站根目录
查找DocumentRoot有这么一行
DocumentRoot “C:/Program Files/Apache Software Foundation/Apache2.2/htdocs”
这就是你网站的根目录,你可以修改,也可以用默认的.如果改,还要修改下面这项,否则可能会出现 403 错误
查找 This should be changed to whatever you set DocumentRoot to
在它下面两行有

把上面两项的 C:/Program Files/Apache Group/Apache2/htdocs 改成你想要的目录

3 查找 DirectoryIndex index.html
修改成
DirectoryIndex index.html index.html.var index.php
这样index.php 可以充当默认页面了

4 Apache中模块化安装php
查找 # LoadModule foo_module modules/mod_foo.so
在此行后加入一行
LoadModule php5_module C:/php5/php5apache2_2.dll

(其中C:/php5/php5apache2_2.dll是你安装php的相应路径.
注意不要把php5apache2_2.dll,php5apache2.dll和php5apache.dll混淆.php5apache.dll只适用于apache 版本1的.
PHP5压缩包里的php5apache2.dll只适用于apache2.0.*版本,如果是2.2.*以上版本,必须使用php5apache2_2.dll.否则就可能会出现
“Cannot load C:/php/php5apache2.dll into server: The specified module could not be found.”
或者:
“The requested operation has failed”
的情况.
不过php5apache2_2.dll出来之后也就没有多少参考价值了)

5 查找 AddType application/x-gzip .gz .tgz
在此行后加入一行
AddType application/x-httpd-php .php
这样apache就可以解释php文件了
到这里配置基本完成了

6 重启apache,在网站根目录下创建一个 phpinfo.php 文件

在浏览器中打开。如果能正常看到php的信息,则说明php已经配置好了。

然后,把你下载好的phpMyAdmin,放到apache下的网站目录下,然后进入http://localhost/phpMyAdmin,就可以用图形管理界面管理你的数据库了。

下面说一说可能出现的问题

The requested operation has failed,其实这个报错很笼统,你根本就无从下手,但是在windows下,你就可以再cmd中使用一个命令来解决,具体的报错原因或者解决方法是:

原因一:80端口占用例如IIS,另外就是迅雷。我的apache服务器就是被迅雷害得无法启用!

原因二:软件冲突装了某些软件会使apache无法启动如Dr.com 你打开网络连接->TcpIp属性->高级->WINS标签 把netbios的lmhosts对勾去掉,禁用tcp/ip的netbios. 然后再启动应该就可以了。

原因三:httpd.conf配置错误如果apache的配置文件httpd.conf搞错了,在windows里启动它,会提示the requested operation has failed,这是比较郁闷的事,因为查错要看个半天。 其实可以用命令行模式启动apache,并带上参数,apache会提示你哪句有误,然后就可以针对性的解决。

原因四:我遇到的就是扩展插件开启的过多,可能互相有影响,所以我们只开启自己需要的插件,不需要的插件就不要开启,因为这样很容易无法保障的,我再这里列个表出来,说说每个扩展模块的作用,方便大家做取舍。

检查错误方法:进入cmd 然后进入 Apache安装目录(具体为你自己的安装目录)\bin> httpd.exe -w -n “Apache2″ -k start

(引号中的Apache2修改为你的Apache服务名,我的是2.2.4版,服务名就是Apache2,可以到计算机服务里找)

扩展库                                     说明 

php_bz2.dll bzip2        压缩函数库 

php_calendar.dll         历法转换函数库 自 PHP 4.0.3 起内置 

php_cpdf.dll Clib         PDF 函数库 

php_crack.dll                密码破解函数库 

php_ctype.dll                ctype 家族函数库 自 PHP 4.3.0 起内置 

php_curl.dll                    CURL    客户端 URL 库函数库 需要:libeay32.dll,ssleay32.dll(已附带) 

php_cybercash.dll    网络现金支付函数库 PHP <= 4.2.0 

php_db.dll                       DBM          函数库 已废弃。用 DBA 替代之(php_dba.dll) 

php_dba.dll                    DBA        数据库(dbm 风格)抽象层函数库 

php_dbase.dll               dBase 函数库 

php_dbx.dll dbx          函数库 

php_domxml.dll         DOM XML 函数库 PHP <= 4.2.0 需要:libxml2.dll(已附带),PHP >= 4.3.0 需要:iconv.dll(已附带) 

php_dotnet.dll               .NET 函数库 PHP <= 4.1.1 

php_exif.dll EXIF        函数库 需要 php_mbstring.dll。并且在 php.ini 中,

php_exif.dll                    必须在 php_mbstring.dll之后加载。 

php_fbsql.dll                  FrontBase 函数库 PHP <= 4.2.0 

php_fdf.dll FDF            表单数据格式化函数库 需要:fdftk.dll(已附带) 

php_filepro.dll              filePro 函数库 只读访问 

php_ftp.dll FTP            函数库 自 PHP 4.0.3 起内置 

php_gd.dll GD               库图像函数库 在 PHP 4.3.2 中删除。此外注意在 GD1 中不能用真彩色函数,用 php_gd2.dll 替代。 

php_gd2.dll GD            库图像函数库 GD2 

php_gettext.dll             Gettext 函数库 PHP <= 4.2.0 需要 gnu_gettext.dll(已附带),PHP >= 4.2.3 需要 libintl-1.dll,iconv.dll(已附带)。 

php_hyperwave.dll HyperWave 函数库 php_iconv.dll ICONV 字符集转换 需要:iconv-1.3.dll(已附带),PHP >=4.2.1 需要 iconv.dll 

php_ifx.dll                       Informix 函数库 需要:Informix 库 

php_iisfunc.dll             IIS 管理函数库 

php_imap.dll                  IMAP,POP3 和 NNTP 函数库 

php_ingres.dll               Ingres II 函数库 需要:Ingres II 库 php_interbase.dll InterBase functions 需要:gds32.dll(已附带) 

php_java.dll                    Java 函数库 PHP <= 4.0.6 需要:jvm.dll(已附带) 

php_ldap.dll                   LDAP 函数库 PHP <= 4.2.0 需要 libsasl.dll(已附带),PHP >= 4.3.0 需要 libeay32.dll,ssleay32.dll(已附带) 

php_mbstring.dll       多字节字符串函数库 

php_mcrypt.dll            Mcrypt 加密函数库 需要:libmcrypt.dll 

php_mhash.dll             Mhash 函数库 PHP >= 4.3.0 需要:libmhash.dll(已附带) 

php_mime_magic.dll Mimetype 函数库 需要:magic.mime(已附带) 

php_ming.dll                 Ming 函数库(Flash) 

php_msql.dll                  mSQL 函数库 需要:msql.dll(已附带) 

php_mssql.dll                MSSQL 函数库 需要:ntwdblib.dll(已附带) 

php_mysql.dll               MySQL 函数库 PHP >= 5.0.0 需要 libmysql.dll(已附带) 

php_mysqli.dll              MySQLi 函数库 PHP >= 5.0.0 需要 libmysql.dll(PHP <= 5.0.2 中是 libmysqli.dll)(已附带) 

php_oci8.dll                    Oracle 8 函数库 需要:Oracle 8.1+ 客户端库 

php_openssl.dll            OpenSSL 函数库 需要:libeay32.dll(已附带) 

php_oracle.dll               Oracle 函数库 需要:Oracle 7 客户端库 

php_overload.dll         对象重载函数库 自 PHP 4.3.0 起内置 

php_pdf.dll                       PDF 函数库 

php_pgsql.dll                  PostgreSQL 函数库 

php_printer.dll             打印机函数库 

php_shmop.dll              共享内存函数库 

php_snmp.dll                 SNMP 函数库 仅用于 Windows NT! 

php_soap.dll                    SOAP 函数库 PHP >= 5.0.0 php_sockets.dll Socket 函数库 

php_sybase_ct.dll        Sybase 函数库 需要:Sybase 客户端库 

php_tidy.dll                     Tidy 函数库 PHP >= 5.0.0 php_tokenizer.dll Tokenizer 函数库 自 PHP 4.3.0 起内置 

php_w32api.dll              W32api 函数库 php_xmlrpc.dll XML-RPC 函数库 PHP >= 4.2.1 需要 iconv.dll(已附带) 

php_xslt.dll                      XSLT 函数库 PHP <= 4.2.0 需要 sablot.dll,expat.dll(已附带)。PHP >= 4.2.1 需要 sablot.dll,expat.dll,iconv.dll(已附带)。 

php_yaz.dll                       YAZ 函数库 需要:yaz.dll(已附带) 

php_zip.dll                        Zip 文件函数库 只读访问 

php_zlib.dll                      ZLib 压缩函数库 自 PHP 4.3.0 起内置