nginx提示:500 Internal Server Error错误的解决方法

现在越来越多的站点开始用 Nginx ,(“engine x”) 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了。Igor 将源代码以类BSD许可证的形式发布。

在高并发连接的情况下,Nginx是Apache服务器不错的替代品。Nginx同时也可以作为7层负载均衡服务器来使用。根据测试结果,Nginx 0.6.31 + PHP 5.2.6 (FastCGI) 可以承受3万以上的并发连接数,相当于同等环境下Apache的10倍。

但很多人用 Nginx 的时候都会出现 500 错误,根据我使用的情况来看,很大一部分原因是 因为文件打开句柄太小有关。

继续阅读“nginx提示:500 Internal Server Error错误的解决方法”

php优化

1. If a method c++an be static, declare it static. Speed improvement is by a factor of 4. 如果一个方法可静态化,就对它做静态声明。速率可提升至4倍。

2. echo is faster than print. echo 比 print 快。

3. Use echo’s multiple parameters instead of string concatenation. 使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接。

4. Set the maxvalue for your for-loops before and not in the loop. 在执行for循环之前确定最大循环数,不要每循环一次都计算最大值。

5. Unset your variables to free memory, especially large arrays. 注销那些不用的变量尤其是大数组,以便释放内存。

6. Avoid magic like __get, __set, __autoload 尽量避免使用__get,__set,__autoload.

7. require_once() is expensive require_once()代价昂贵。

8. Use full paths in includes and requires, less time spent on resolving the OS paths. 在包含文件时使用完整路径,解析操作系统路径所需的时间会更少。

继续阅读“php优化”

Redis类

phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系

很有用;以下是redis官方提供的命令使用技巧:

下载地址如下:

https://github.com/owlient/phpredis(支持redis 2.0.4)
Redis::__construct构造函数
$redis = new Redis();

connect, open 链接redis服务
参数
host
: string,服务地址
port
: int,端口号
timeout
: float,链接时长 (可选, 默认为 0 ,不限链接时间)
注: 在redis.conf中也有时间,默认为300

pconnect, popen 不会主动关闭的链接
参考上面

继续阅读“Redis类”

Boolean 布尔类型

这是最简单的类型。boolean 表达了真值,可以为 TRUEFALSE

语法

要指定一个布尔值,使用关键字 TRUEFALSE。两个都不区分大小写。

<?php
$foo = true; // assign the value TRUE to $foo
?>

通常运算符所返回的 boolean 值结果会被传递给控制流程。

// == 是一个操作符,它检测两个变量是否相等,并返回一个布尔值
if ($action == “show_version”) {
echo “The version is 1.23”;
}

// 这样做是不必要的…
if ($show_separators == TRUE) {
echo “<hr>\n”;
}

// …因为可以使用下面这种简单的方式:
if ($show_separators) {
echo “<hr>\n”;
}

转换为布尔值

要明确地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制结构需要一个 boolean 参数时,该值会被自动转换。

当转换为 boolean 时,以下值被认为是 FALSE

  • 布尔值 FALSE 本身
  • 整型值 0(零)
  • 浮点型值 0.0(零)
  • 空字符串,以及字符串 “0”
  • 不包括任何元素的数组
  • 不包括任何成员变量的对象(仅 PHP 4.0 适用)
  • 特殊类型 NULL(包括尚未赋值的变量)
  • 从空标记生成的 SimpleXML 对象

所有其它值都被认为是 TRUE(包括任何资源)。

-1 和其它非零值(不论正负)一样,被认为是 TRUE

var_dump((bool) “”);        // bool(false)
var_dump((bool) 1);         // bool(true)
var_dump((bool) -2);        // bool(true)
var_dump((bool) “foo”);     // bool(true)
var_dump((bool) 2.3e5);     // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array());   // bool(false)
var_dump((bool) “false”);   // bool(true)

PHP截断函数mb_substr()介绍

mb_substr获取字符串的部分

string mb_substr ( string $str , int $start [, int $length = NULL [, string $encoding = mb_internal_encoding() ]] )

根据字符数执行一个多字节安全的 substr() 操作。 位置是从 str 的开始位置进行计数。 第一个字符的位置是 0。第二个字符的位置是 1,以此类推。

参数

str

从该 string 中提取子字符串。

start

str 中要使用的第一个字符的位置。

length

str 中要使用的最大字符数。 If omitted or NULL is passed, extract all characters to the end of the string.

encoding

encoding 参数为字符编码。如果省略,则使用内部字符编码。

返回值

mb_substr() 函数根据 startlength 参数返回 str 中指定的部分。

$str = ‘这样一来我的字符串就不会有乱码^_^’;

echo “mb_substr:” . mb_substr($str, 0, 7, ‘UTF-8’);
//结果:这样一来我的字
echo ”
“;

echo “mb_strcut:” . mb_strcut($str, 0, 6, ‘utf-8’);
//结果:这样

可以截断中英混合字符串不出现乱码。

empty()和isset()函数的区别

empty检查一个变量是否为空

如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,“”0“0”NULLFALSEarray()var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE

除了当变量没有置值时不产生警告之外,empty()(boolean) var 的反义词。

empty() 与 isset() 的一个简单比较。

<?php
$var = 0;
// 结果为 true,因为 $var 为空
if (empty($var)) {
echo ‘$var is either 0 or not set at all’;
}

// 结果为 false,因为 $var 已设置
if (!isset($var)) {
echo ‘$var is not set at all’;
}
?>

注意:

因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。

empty() 只检测变量,检测任何非变量的东西都将导致解析错误。换句话说,后边的语句将不会起作用: empty(addslashes($name))

isset检测变量是否设置

检测变量是否设置,并且不是 NULL

如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节(”\0″)并不等同于 PHP 的 NULL 常数。

如果 var 存在并且值不是 NULL 则返回 TRUE,否则返回 FALSE

Warning

isset() 只能用于变量,因为传递任何其它参数都将造成解析错误。若想检测常量是否已设置,可使用 defined() 函数。

注意:

因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。

如果使用 isset() 来检查对象无法访问的属性,如果 __isset() 方法已经定义则会调用这个重载方法。

Mencache

1、什么是Memcache

分布式高速缓存系统,存储在内存中

2、什么时候使用Memcache

在应用和数据库当中添加一个缓冲层,当第一次读取数据后,把数据存储在Memcache中,当第二次或者之后读取数据时,就从Memcache中读取,从而减轻Mysql数据库等服务器的压力。

Memcache使用场景:

  1. 非持久化存储:对数据存储要求不高
  2. 分布式存储:不适合单机使用
  3. key/value存储:格式简单,不支持List、Array数据格式

Memcache服务端和客户端的安装,自行google 百度。

PHP中使用Memcache

系统类:addServer,addServers,getStats,getVersion

数据类:add,set,delete,flush,replace,increment,get

进阶类:setMulti,deleteMulti,getMulti,getResultCode,getResultMessage

$m = new Memcached();
$m->addServer(‘127.0.0.1’,11211);
$m->add(‘mkey’,’mvalue’,600); // 参数1:键 参数2:键对应的值 参数3:保存时间(秒)
$m->set(‘mkey1’, ‘mvalue1’, 600); // 当对应键没有值存在时,新增一条,当存在时,覆盖掉原来的值

// increment 对缓存值进行自增
$m->set(‘num’, 5, 0);
$m->increment(‘num’, 2); // 对num所对应对值自增2
// decrement 对缓存值进行自减
$m->decrement(‘num’, 3); // 对num所对应的值自减3

// 删除数据
$m->delete(‘mkey’); // 删除对应键值对
$m->flush(); // 清空memcache所有缓存值,慎用

echo $m->get(‘mkey’); // 获取键所对应的值

// 一次设置多个值、一次获取多个值、一次删除多条数据
$array = array(
‘key’ => ‘value’,
‘key2’ => ‘value2’,
);
$m->setMulti($array, 0); // 参数1:键值对数组 参数2:保存时间
$res = $m->getMulti(array(‘key’, ‘key2’)); // 参数:键数组
print_r($res);
$m->deleteMulti(array(‘key’, ‘key2’)); // 参数:键数组

echo $m->getResultCode(); // 获取上一次操作返回的编码
echo $m->getResultMessage(); // 获取上一次操作返回的信息

封装自己的Memcache类

扩展性

可调试

尽量简便的操作,一个方法多种功能

 

项目中使用Memcache

1.即时生成缓存

2.提前生成缓存

3.永久缓存

算法效率的度量方法

一、事后统计法

事后统计法:这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。

缺点:

必须依据算法事先编制好程序,这通常需要花费大量时间和精力。

时间的比较依赖计算机硬件和软件等环境因素,有时会掩盖算法本身的优劣。

算法的测试数据设计困难,并且程序的运行时间往往还与测试数据的规模有很大关系,效率高的算法在小的测试数据面前往往得不到体现。

二、事前分析估算方法

事前分析估算方法:在计算机程序编制前,依据统计方法对算法进行估算。

一个用高级程序语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:

1.算法采用的策略、方法。(算法好坏的根本)

2.编译产生的代码质量。(软件支持)

3.问题的输入规模。

4.机器执行指令的速度。(硬件性能)

抛开计算机硬件、软件有关的因素,一个程序的运行时间,依赖于算法的好坏和问题的输入规模。所谓问题输入规模是指输入量的多少。

测定运行时间最可靠的方法就是计算对运行时间有消耗的基本操作的执行次数。运行时间与这个计数成正比。

算法设计的要求

一、正确性

正确性:算法的正确性是指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。

算法“正确”的层次:

1.算法程序没有语法错误

2.算法程序对于合法的输入数据能够产生满足要求的输出结果。

3.算法程序对于非法的输入数据能够得出满足规格说明的结果。(一般以此为正确的标准)

4.算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果。

二、可读性

可读性:算法设计的另一目的是为了便于阅读、理解和交流。(算法好坏的重要标志)

三、健壮性

健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果。

四、时间效率高和存储量低