shmphp
1. FastCGI sent in stderr: "Primary script unknown" 这个问题有没遇到过没
默认的nginx连接方式为php-cgi监听127.0.0.1:9000的方式,使用socket方式连接
nginx配置方法:
location ~ .php$ {
fastcgi_pass unix:/dev/shm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/code/public_html$fastcgi_script_name;
include fastcgi_params;
}
在PHP的www.conf中修改
vi /etc/php-fpm.d/www.conf
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm/php5-fpm.sock
2. php ob_start提高多少速度
由于PHP是“一边编译一边执行”的脚本语言,某种程度上也提供了一种相当方便的结果集缓存使用方法—通过动态include相应的数据定义代码段的方式使用缓存。
近来做了一阵子程序性能的优化工作,有个比较有意思的想法,想提出来和大家交流一下。
Cache是“以空间换时间”策略的典型应用模式,是提高系统性能的一种重要方法。缓存的使用在大访问量的情况下能够极大的减少对数据库操作的次数,明显降低系统负荷提高系统性能。相比页面的缓存,结果集是一种“原始数据”不包含格式信息,数据量相对较小,而且可以再进行格式化,所以显得相当灵活。由于PHP是“一边编译一边执行”的脚本语言,某种程度上也提供了一种相当方便的结果集缓存使用方法——通过动态include相应的数据定义代码段的方式使用缓存。如果在“RamDisk”上建缓存的话,效率应该还可以得到进一步的提升。以下是一小段示例代码,供参考。
// load data with cache
function
load_data($id,$cache_lifetime) {
// the return data
$data =
array();
// make cache filename
$cache_filename =
‘cache_‘.$id.‘.php‘;
// check cache file‘s last modify time
$cache_filetime = filemtime($cache_filename);
if (time() -
$cache_filetime <= $cache_lifetime) {
//** the cache is not expire
include($cache_filename);
} else {
//** the cache is
expired
// load data from database
// ...
while
($dbo->nextRecord()) {
// $data[] = ...
}
// format
the data as a php file
$data_cache = "
while (list($key, $val) =
each($data)) {
$data_cache .= "\$data[‘$key‘]=array(‘";
$data_cache .= "‘NAME‘=>\"".qoute($val[‘NAME‘])."\","
$data_cache .= "‘VALUE‘=>\"".qoute($val[‘VALUE‘])."\""
$data_cache .= ";);\r\n";
}
$data_cache = "?>\r\n";
// save the data to the cache file
if ($fd =
fopen($cache_filename,‘w+‘)) {
fputs($fd,$data_cache);
fclose($fd);
}
}
return $data;
}
?> 适用情况:
1.数据相对比较稳定,主要是读取操作。
2.文件操作要比数据库操作快。
3.复杂数据访问,大数据量访问,密集数据访问,系统数据库负载极重。
4.Web/DB分离结构或者多Web单DB结构。
未经证实的问题:
1.并发访问时对文件的读写是否会引起锁定问题。
2.涉及到的数据文件太多时,性能如何。
扩展思路:
1.生成JavaScript数据定义代码,在客户端调用。
2.还未想到……
望共同探讨。
缓存
如果你想要让自己庞大的PHP应用有更好的性能表现,采用缓存也是一种很好的方法。现在已经有许多缓存方案可供选择,其中包括:Zend
Cache,APC,和Afterburner Cache。
所有这些产品都属于“缓存模块”。当第一次出现对.php文件的请求时,它们会在Web服务器内存中保存PHP的中间代码,此后就用“经过编译”的版本响应后继的请求。这种方法确实能够改善应用的性能,因为它使得磁盘访问量减低到了最少的程度(代码已经读取和解析),代码直接在内存中运行使得服务器响应请求的速度大大提高。当然,缓存模块还会监视PHP源文件的变化,必要时重新缓存页面,从而防止了用户得到的页面仍旧由过时的PHP代码生成。由于缓存模块能够明显地降低服务器的负载、提高PHP应用的响应效率,因此它们非常适合于负载较大的网站使用。
如何选择这些缓存产品
Zend Cache是Zend Technologies公司的商业软件,而Zend
Technologies就是前面提到的那个为我们提供PHP引擎和免费Zend Optimizer的公司。Zend
Cache确实是名不虚传!对于大型的PHP页面,你可以感觉到第一次运行之后速度就会有所提高,而且服务器也会有更多的可用资源。遗憾的是这个产品并不免费,不过在有些情形下它仍旧是物超所值。
Afterburner Cache是来自Bware Technologies的免费缓存模块,当前这个产品还是Beta版。Afterburner
Cache的做法看起来与Zend Cache差不多,但它对性能的改善程度(还)不能与Zend Cache相比,而且它还不能与Zend
Optimizer一起工作。
APC是Alternative PHP Cache的缩写,它是来自Community
Connect的又一个免费缓存模块。这个产品已经具有足够的稳定性供正式场合使用,而且它看起来也能在很大程度上提高响应请求的速度。
有关压缩
来自Remote
Communications的免费Apache模块mod_gzip就具有为支持这类内容编码的浏览器压缩静态Web内容的能力。对于绝大多数静态Web内容,mod_gzip都非常有效。mod_gzip可以方便地编译到Apache里面,也可以作为DSO使用。据Remote
communications公司说,mod_gzip也能够压缩来自mod_php、mod_perl等的动态内容。我试了一次又一次,但看来还是不行。我看了许多关于mod_gzip的论坛和文章,看来到了mod_gzip的下一个版本(可能是1.3.14.6f)这个问题有望得到解决。在此之前,我们可以在网站的静态部分使用mod_gzip。
然而有时我们确实蹊要压缩动态内容,所以必须找找其他办法。有一种办法是使用class.gzip_encode.php,这是一个可以用来压缩页面内容的PHP类,具体方法是在PHP脚本的开头和末尾调用该类的某些函数。如果要在网站级实现这个方案,可以从php.ini文件的auto_prepend以及auto_append指令调用这些函数。这种方法虽然有效,但它无疑为高负载的网站带来了更多的开销。关于如何使用这个类的详细说明,请参见它的源代码。它的源代码说明相当完善,作者告诉了你所有你必须知道的事情。
PHP
4.0.4有一个新的输出缓存句柄ob_gzhandler,它与前面的类相似,但用法不同。使用ob_gzhandler时要在php.ini中加入的内容如下:
output_handler = ob_gzhandler
;
这行代码使得PHP激活输出缓存,并压缩它发送出去的所有内容。如果由于某种原因你不想在php.ini中加上这行代码,你还可以通过PHP源文件所在目录的.htaccess文件改变默认的服务器行为(不压缩),语法如下:
php_value
output_handler ob_gzhandler
或者是从PHP代码调用,如下所示:
ob_start("ob_gzhandler");
采用输出缓存句柄的方法确实非常有效,而且不会给服务器带来什么特殊的负荷。但必须注意的是,Netscape
Communicator对压缩图形的支持不佳,因此除非你能够保证所有用户都使用IE浏览器,否则你应该禁止压缩JPEG和GIF图形。一般地,对于所有其他文件,这种压缩都有效,但建议你针对各种浏览器都分别进行测试,特别是当你使用了特殊的插件或者数据查看器时这一点尤其重要。
阅读提示:PEAR 的缓冲包提供了缓冲动态内容,数据库查询和 PHP 函数调用的框架。本文介绍如何采用 PEAR 来缓冲 PHP 程序
采用 PEAR 来缓冲 PHP 程序
PHP 世界中缓冲是一个热门的话题,因为 PHP 产生的动态页面,每次用户请求都需要重新计算,不论请求的结果是否一样,同时,PHP
每次都会编译一次脚本。这样的超负荷运转对一个流量很高的网站来说肯定难以忍受。幸运的是, Web 的结果可以缓冲,而不需要重新运行和编译脚本,商品化的产品像
ZendCache 或者开源的 Alternate PHP Cache都提供了把 PHP 脚本编译为字节代码并缓冲的办法。
PEAR
的缓冲包提供了缓冲动态内容,数据库查询和 PHP 函数调用的框架。
就像 Perl 有 CPAN, TeX 有 CTAN,PHP
也有自己的中心资源库,存放类,库和模块。这个库称为 PEAR(PHP Extension and Add-On
Repository)。
本文假设你已经安装了 PEAR 环境,如果没有的话,可以去 PHP 网站下载。PEAR
的缓冲包包含一个总体的缓冲类和几个特别的子类。缓冲类使用容器类来存贮和管理缓冲数据。
下面是 PEAR
缓冲当前所包含的容器,以及各自的参数:
file -- file 容器在文件系统存储了缓冲的数据,是最快的容器。
cache_dir
-- 这是容器存储文件的目录。
filename_prefix -- 缓冲文件的前缀,例如:"cache_"。
shm -- shm
容器把缓冲数据放入共享内存,基准测试显示,目前的实现下,这个容器的速度要比文件容器慢。
shm_key --
共享内存使用的键值。
shm_perm -- 使用共享内存数据段的权限。
shm_size --
分配共享内存的大小。
sem_key -- 信号灯的键值。
sem_perm -- 信号灯的权限。
db --
PEAR 的数据库抽象层。
dsn -- 数据库连接的 DSN 。可以参考 PEAR 的 DB 文档。
cache_table --
表的名字。
phplib -- phplib
容器使用数据库抽象层存储缓冲。
db_class
db_file
db_path
local_file
local_path
ext/dbx
-- PHP
的数据库抽象层扩展,如果像把缓冲存入数据库,可以采用这个容器。
mole
host
db
username
password
cache_table
persistent
使用
PEAR Cache 所得到的性能提升取决于你所选择的缓冲容器,例如,把数据库的结果再次存入数据库缓冲中就显得毫无意义。
PEAR Cache
的函数缓冲模块能把任何函数或者方法的结果缓冲,不论是 PHP
的内置函数还是用户自定义函数,他缺省采用文件容器,把缓冲数据放入到一个叫做function_cache 的目录。
Cache_Function
类的构造器可以有三个可选的参数:
$container :缓冲容器的名字。
$container_options
:缓冲容器的数组参数。
$expires:缓冲对象过期的时间(秒数)。
普通的函数调用采用 Cache_Function 类的
call() 方法时,就能触发缓冲。调用 call()
很容易,的一个参数是函数的名字,然后是函数的参数,第二个参数是要调用函数中的第一个,依此类推,我们来看例子:
例1
缓冲函数和方法的调用
// 调用 PEAR Cache 的函数缓冲。
require_once
'Cache/Function.php';
// 定义一些类和函数。
class foo {
function
bar($test) {
echo
"foo::bar($test)
";
}
}
class bar {
function
foobar($object) {
echo
'$'.$object.'->foobar('.$object.')
';
}
}
$bar =
new bar;
function foobar() {
echo 'foobar()';
}
//
取得 Cache_Function 对象
$cache = new Cache_Function();
// 对 foo
类的静态函数 bar() 作缓冲(foo::bar())。
$cache->call('foo::bar',
'test');
// $bar->foobar()
$cache->call('bar->foobar',
'bar');
$cache->call('foobar');
?>
下面我们采用
Cache_Output 来把输出作缓冲:
例2 缓冲脚本的输出
// 加载 PEAR
Cache 的输出缓冲
require_once 'Cache/Output.php';
$cache = new
Cache_Output('file', array('cache_dir' => '.') );
//
计算要缓冲页面的标记,我们假定页面的缓冲取决于
// URL, HTTP GET 和 POST 变量以及
cookies。
$cache_id = $cache->generateID(
array('url' =>
$REQUEST_URI, '
post' => $HTTP_POST_VARS, 'cookies' =>
$HTTP_COOKIE_VARS) );
// 查询缓冲
if ($content =
$cache->start($cache_id)) {
// 缓冲命中
echo
$content;
die();
}
// 缓冲丢失
// -- 在这里插入内容产生代码
--
// 把页面存入缓冲
echo $cache->end();
?>
利用 Cache_Output 类,很容易把一个动态的数据库驱动的网站应用转化为静态,从而极大的提升站点的性能。越来越多的站点在采用 GZIP 压缩
HTML 内容,这样减少了服务器的带宽消耗,对于使用 Modem 上网的用户来说也能受益不少。
Cache_OutputCompression
扩展了 Cache_Output 类的功能,他把 GZIP 压缩的 HTML 内容进行缓冲,从而节省了 CPU 压缩的时间。
阅读提示:在本篇文章中,我们将对PHP应用程序的分析、如何改变脚本代码以及比较优化前后的各种参数值进行简要的介绍。
PHP应用程序的性能优化
使用PHP编程的最大好处是学习这种编程语言非常容易以及其丰富的库。即使对需要使用的函数不是十分了解,我们也能够猜测出如何完成一个特定的任务。
尽管PHP非常简单易学,但我们仍然需要花费一点时间来学习PHP的一些编程技巧,尤其是与性能和内存占用相关的技巧。在PHP中,有许多小技巧能够使我们减少内存的占用,并提高应用程序的性能。在本篇文章中,我们将对PHP应用程序的分析、如何改变脚本代码以及比较优化前后的各种参数值进行简要的介绍。
通过在程序中设置计时的程序,并反复执行这些代码,我们可以获得有关程序执行速度的一组数据,这些数据可以可以用来发现程序中的瓶颈,以及如何进行优化,提高应用程序的性能。
也许读者曾经听说过PEAR库吧。我们将使用PEAR库创建在分析时需要使用的例子,这也是对现有的代码进行分析的最简单的方法,它使我们无需使用商用产品就能对代码进行分析。
我们要使用的库的名字是PEAR::Benchmark,它对于对代码进行分析和性能测试非常有用。这个库提供一个名字为Benchmark_Timer()的类,能够记录一个函数调用和下一个函数调用之间的时间。在对代码的性能进行测试时,我们可以得到一个详细的脚本执行结果,它非常简单,如下所示:
include_once("Benchmark/Timer.php");
$bench
= new Benchmark_Timer;
$bench-> start();
$bench->
setMarker('Start of the script');
//
现在处于睡眠状态几分钟
sleep(5);
$bench-> stop();
//
从计时器中获得分析信息
print_r($bench->
getProfiling());
?>
上面代码执行后的输出如下所示:
Array
(
[0] => Array
(
[name] =>
Start
[time] => 1013214253.05751200
[diff] =>
-
[total] => 0
)
[1] =>
Array
(
[name] => Start of the script
[time] =>
1013214253.05761100
[diff] => 9.8943710327148E-05
[total]
=> 9.8943710327148E-05
)
[2] =>
Array
(
[name] => Stop
[time] =>
1013214258.04920700
[diff] => 4.9915959835052
[total] =>
4.9916949272156
)
)
上面的数字似乎是一组杂乱无章的数字,但如果程序的规模更大,这些数字就十分地有用了。
也许广大读者也能猜测到,数组的第一个表目是实际调用Benchmark_Timer()类的方法,例如
$bench->
start()、$bench-> setMarker()和$bench->
stop(),与这些表目有关的数字是相当简单的,现在我们来仔细地研究这些数字:
[0] => Array
(
[name] => Start
[time] => 1013214253.05751200
[diff] => -
[total] => 0
)
time表目指的是何时对Benchmark_Timer()的start()方法调用的UNIX的timestamp,diff表目表示这次调用和上次调用之间的时间间隔,由于这里没有上一次,因此显示出了一个破折号,total表目指的是自测试开始到这一特定的调用之前代码运行的总的时间。下面我们来看看下一个数组的输出:
[1]
=> Array
(
[name] => Start of the script
[time] => 1013214253.05761100
[diff] =>
9.8943710327148E-05
[total] => 9.8943710327148E-05
)
从上面的数字我们可以看出,在调用$bench->
start()之后,程序运行了9.8943710327148E-05秒(也就是0.0000989秒)后开始调用$bench->
setMarker(....)。
一次真实的性能测试经历
尽管上面的例子不错,但在对于决定如何优化你的站点代码设计方面,它真的不能算是一个好例子。下面我将用我自己作为网站技术人员的一段亲身经历来说明如何解决性能方面存在的问题。
我并不大理解网站使用的代码,因为它是根据特殊的需求,历经多年开发而成的━━其中的一个模块包括网站转换代码,另一个模块记录网站的使用情况,其他的模块也各有各的作用。我和网站的主要开发者都意识到网站的代码需要优化,但又不清楚问题出在哪儿。
为了尽快地完成任务,我开始研究网站的主要脚本代码,并在全部脚本代码以及其包含文件中添加了一些$bench->
setMarker()命令,然后分析$bench->
getProfiling()的输出,并对得到的结果大吃一惊,原来问题出在一个与获得特定语言名字(例如en代表english)的转换代码的函数调用中,该函数在每个页面上都会被使用数百次。每次调用该函数时,脚本代码都会对一个Mysql数据库进行查询,从一个数据库表中获得真正的语言名字。
于是我们这一类的信息创建了一个缓冲系统。经过短短2天时间的工作,我们使系统的性能得到了很大的提高,第一周内页面的浏览量也因此而增加了40%。当然了,这只是一个有关分析代码能够提高互联网应用或互联网网站性能的例子。
性能测试函数调用
在分析一个脚本或网页(以及其包含文件)时,尽管Benchmark_Timer()特别有用,但它并不科学,因为要获得分析的数据我们必须多次加载脚本,而且它也不是针对某个类或函数调用的。
PEAR::Benchmark库中的另一个被称作Benchmark_Iterator的类能够很好地解决这一个问题,它能够针对特定的函数或类的方法,显示其分析信息。它的用途是能够能够从测试中获得一致的结果,因为我们知道,如果运行一段脚本一次,其运行时间为10秒,并不意味着它每次的运行时间总是10秒。
In
any case, let's see some examples:
//
连接数据库的代码
include_once("DB.php");
$dsn = array(
'phptype'
=> 'mysql',
'hostspec' => 'localhost',
'database'
=> 'database_name',
'username' =>
'user_name',
'password' => 'password'
);
$dbh =
DB::connect($dsn);
function getCreatedDate($id)
{
global
$dbh;
> $stmt = "SELECT created_date FROM users WHERE
id=$id";
// 在这里使用PEAR::DB
$created_date = $dbh->
getOne($stmt);
if ((PEAR::isError($created_date)) ||
(empty($created_date))) {
return false;
} else
{
return $created_date;
}
}
include_once
'Benchmark/Iterate.php';
$bench = new Benchmark_Iterate;
//
运行getDate函数10次
$bench-> run(10, 'getCreatedDate', 1);
//
打印分析信息
print_r($bench-> get());
?> 运行上面的代码能够产生与下面相似的结果:
Array
(
[1] => 0.055413007736206
[2] =>
0.0012860298156738
[3] => 0.0010279417037964
[4] =>
0.00093603134155273
[5] => 0.00094103813171387
[6] =>
0.00092899799346924
[7] => 0.0010659694671631
[8] =>
0.00096404552459717
[9] => 0.0010690689086914
[10] =>
0.00093603134155273
[mean] => 0.0064568161964417
[iterations]
=> 10
)
上面的这些数字很好理解,mean条目表示getCreatedDate()函数10次运行的平均时间。在进行实际测试时,应该至少运行1000次,但这个例子得出的结果已经足够说明问题了。
3. php网站不能进后台
服务器出现错误提示 1.网页无法打开。 2.出现 php has encountered an unhandled exception code xxxxxxx. xxxxxxxxxxx 解决方法如下: 1. - 控制面板--> 管理工具--> 组件服务 2. - 展开 组件服务--> 计算机 --> 我的电脑 --> com+ 应用程序 3. - 右键点击 iis out-of-process pooled applications 选择属性 4. - 选择 "标识" 选项卡 5. - 选择 "交互式用户 - 目前已登录的用户" 6. - 点 "确定" 7. - 重启服务器 服务器出现错误提示 1.网页无法打开。 2.出现 php has encountered an unhandled exception code xxxxxxx. xxxxxxxxxxx 解决方法如下: 1. - 控制面板--> 管理工具--> 组件服务 2. - 展开 组件服务--> 计算机 --> 我的电脑 --> com+ 应用程序 3. - 右键点击 iis out-of-process pooled applications 选择属性 4. - 选择 "标识" 选项卡 5. - 选择 "交互式用户 - 目前已登录的用户" 6. - 点 "确定" 7. - 重启服务器 第二个问题 这个问题不是很好处理,困惑了很多站长非常时间了 主要出现在windows主机的服务器上。 在php官方, http://bugs.php.net/ 也能够查到两三千页的报告,他们官方也是束手无策,经过了11个小版本后,还是没有彻底解决 http://bugs.php.net/search.php?cmd=display&search_for=PHP+has+encountered+an+Access&x=8&y=9 目前我提供一下这几年我维护经验,我的一些民间解决办法 第一种可能: 去掉 php中 eaccelerator 的扩展 这样做能够解决您的问题,不过可能会加重系统负担 因为eaccelerator主要是为了节省系统资源的东西 具体做法是找到php.ini 如果是我帮您配置的,一般在c:/php/php.ini或者 c:/winnt/php.ini 或者c:/windows/php.ini 去掉 zend_extension_ts="C:\php\extensions\eaccelerator_win_xxx.dll" eaccelerator.shm_size="16" eaccelerator.cache_dir="c:\temp" eaccelerator.enable="1" eaccelerator.optimizer="1" eaccelerator.check_mtime="1" eaccelerator.debug="0" eaccelerator.filter="" eaccelerator.shm_max="0" eaccelerator.shm_ttl="0" eaccelerator.shm_prune_period="0" eaccelerator.shm_only="0" eaccelerator.compress="1" eaccelerator.compress_level="9" ea主要是在unix环境下开发的,但是作者忽略到windows实际上不像u主机那样,是没有u主机的那种内存共享机制的 这个bug已经提交给他们了,希望0.9.5能够解决 当然,如果您的机器这个问题不严重,建议还是保留,ea是一块非常优秀的Php缓存+加速软件 配合zo使用,将会降低系统负担 50%-80%左右,提高负载能力、速度和效率 200%左右 第二种可能 session_save_path 需要设定一个实际的物理路径,并且该目录需要everyone的所有权限,类似U主机的0777 第三种可能 c:/winnt/temp 或者 c:/windows/temp 也需要everyone的所有权限,类似U主机的0777 第四种
4. nginx端口转发,php报错
root**;是什么意思??去掉试试。
location~.php{
#fastcgi_passremote_php_ip:9000;
fastcgi_passunix:/dev/shm/php-cgi.sock;
fastcgi_indexindex.php;
includefastcgi_params;
set$real_script_name$fastcgi_script_name;
if($fastcgi_script_name~"^(.+?.php)(/.+)$"){
set$real_script_name$1;
#set$path_info$2;
}
fastcgi_paramSCRIPT_FILENAME$document_root$real_script_name;
fastcgi_paramSCRIPT_NAME$real_script_name;
#fastcgi_paramPATH_INFO$path_info;
}
5. CentOS 7 用户怎样安装 LNMP
配置安装
基于 YUM 特性,可以简单快速的安装 LNMP 环境。
配置 YUM 源
CentOS 7 的 默认 YUM 源里的软件包版本可能不是最新的,如果要安装最新的软件包就得配置下 YUM 源。
配置 YUM 源可以通过直接安装 RPM (Red Hat Package Manager) 包,或者修改 Repository,本文讲解通过安装 RPM 方式。
首先需要安装 EPEL ( Extra Packages for Enterprise linux ) YUM 源,用以解决部分依赖包不存在的问题:
yum install -y epel-release
接着是 MySQL YUM 源,MySQL 官网给出了配置教程,因为本文章讲解的是 CentOS 7,我们只需要安装对应的 RPM 包就行了。
安装 RPM 包前需要导入 RPM-GPG-KEY 文件,不然安装过程会出错。
将 MySQL RPM-GPG-KEY 另存为 mysql_pubkey.asc 并导入 :
rpm --import mysql_pubkey.asc
导入后安装 CentOS 7 的 MySQL RPM 包:
rpm -Uvh http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
然后是 PHP YUM 源,PHP 最新的 RPM 包,可以使用 Remi's RPM repository。
导入 PHP RPM-GPG-KEY (remi):
rpm --import http://rpms.remirepo.net/RPM-GPG-KEY-remi
安装 PHP RPM (remi) 包:
rpm -Uvh http://remi.mirrors.arminco.com/enterprise/remi-release-7.rpm
最后是 Nginx YUM 源,Nginx 官网也给出了配置教程。
导入 Nginx RPM-GPG-KEY:
rpm --import http://nginx.org/packages/keys/nginx_signing.key
安装 Nginx RPM 包:
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
到目前为止,YUM 源已经安装好了 ,接着进行下一步的配置。
MySQL YUM 源默认是启用的 MySQL-5.6,PHP YUM 源默认都没有启用,Nginx YUM 源默认是启用的 Nginx-1.8。
定位到 /etc/yum.repos.d/,对 后缀为 .repo 的文件进行编辑,修改 enabled 为 1 以启用。
启用 PHP-7.0 :
1、修改 /etc/yum.repos.d/remi.repo,将 [remi] 和 [remi-test] 下面的 enabled=0 改为 enabled=1;
2、修改 /etc/yum.repos.d/remi-php70.repo,将 [remi-php70] 下面的 enabled=0 改为 enabled=1;
sed -i "/remi\/mirror/{n;s/enabled=0/enabled=1/g}" /etc/yum.repos.d/remi.repo
sed -i "/test\/mirror/{n;n;s/enabled=0/enabled=1/g}" /etc/yum.repos.d/remi.repo
sed -i "/php70\/mirror/{n;s/enabled=0/enabled=1/g}" /etc/yum.repos.d/remi-php70.repo
到这一步 YUM 配置就算完成了,清除并生成 YUM 缓存使之生效:
yum clean all
yum makecache
安装 MySQL + PHP + Nginx + phpMyAdmin
YUM 源已经配置好了,现在直接安装 MySQL + PHP + Nginx + phpMyAdmin:
yum install -y mysql-community-server nginx php php-bcmath php-fpm php-gd php-json php-mbstring php-mcrypt php-mysqlnd php-opcache php-pdo php-pdo_dblib php-pgsql php-recode php-snmp php-soap php-xml php-pecl-zip phpMyAdmin
注:上面安装的 php-* 可以根据实际使用情况选择安装
安装完成后,进行下一步的环境配置,MySQL 配置文件在 /etc/my.cnf.d/,PHP 配置文件在 /etc/php-fpm.d/,Nginx 配置文件在 /etc/nginx/ ,phpMyAdmin 的配置文件在 /etc/phpMyAdmin/。
配置 MySQL
MySQL 配置文件保持默认,运行一次安全配置即可。
启动 MySQL:
systemctl start mysqld.service
安全配置 MySQL:
设置 root 密码、删除匿名用户、禁止 root 远程登录、删除 test 数据库、重新加载权限表,一路 Y 下去
mysql_secure_installation
配置 PHP
PHP 默认配置文件使用的是监听 9000 端口进行通信,针对小型单一、没有做负债均衡的服务器,可以使用 unix sock 方式通信。
使用 unix sock 方式需要修改 PHP 配置文件:
#更换监听方式
listen = /dev/shm/php-fpm-default.sock
#监听队列最大长度为不限
listen.backlog = -1
#指定监听用户和用户组(需存在)
listen.owner = www
listen.group = www
启动 PHP-FPM:
systemctl start php-fpm.service
配置 Nginx
让服务器默认访问显示为 400 提示页。
#新建名为 nginx-default.conf 的配置文件
touch /etc/nginx/conf.d/nginx-default.conf
#编辑配置文件
vi /etc/nginx/conf.d/nginx-default.conf
将以下信息输入到 nginx-default.conf
server
{
listen 80 default;
return 400;
}
按下 Esc,输入 :x 保存并退出。
防火墙放行 HTTP 端口访问:
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --reload
启动 Nginx:
systemctl start nginx.service
这时,在浏览器地址栏输入当前服务器 IP 就会看到一个 400 的提示页面了。
进阶!绑定域名+站点目录+保存日志+运行 PHP的配置文件:
server
{
listen 80; #监听80端口
server_name default.com www.default.com; #绑定域名 default.com 和 www.default.com
index index.html index.htm index.php; #设置首页文件,越前优先级越高
charset utf-8; #设置网页编码
root /home/wwwroot/default; #设置站点根目录
#运行 PHP
location ~ .*\.php$
{
fastcgi_pass 127.0.0.1:9000 #默认使用9000端口和PHP通信
#fastcgi_pass unix:/dev/shm/php-fpm-default.sock; #使用 unix sock 和PHP通信
fastcgi_index index.php;
fastcgi_param DOCUMENT_ROOT /home/wwwroot/default; #PHP 文档根目录
fastcgi_param SCRIPT_FILENAME /home/wwwroot/default$fastcgi_script_name; #PHP 脚本目录
include fastcgi_params;
try_files $uri = 404;
}
#设置文件过期时间
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp3|wma)$
{
expires 30d;
}
#设置文件过期时间
location ~ .*\.(js|css)$
{
expires 12h;
}
#设置文件访问权限
location ~* /templates(/.*)\.(bak|html|htm|ini|old|php|tpl)$ {
allow 127.0.0.1;
deny all;
}
#设置文件访问权限
location ~* \.(ftpquota|htaccess|htpasswd|asp|aspx|jsp|asa|mdb)?$ {
deny all;
}
#保存日志
access_log /var/log/nginx/default-access.log main;
error_log /var/log/nginx/default-error.log crit;
}
配置 phpMyAdmin
# 编辑配置文件
vi etc/phpMyAdmin/config.inc.php
修改以下内容:
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['socket'] = '/var/lib/mysql/mysql.sock';
$cfg['Servers'][$i]['connect_type'] = 'socket';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['UploadDir'] = '/tmp';
$cfg['SaveDir'] = '/tmp';
如果Nginx使用的是上面的进阶代码,那么把 phpMyAdmin 的目录 复制到 /home/wwwroot/default/phpMyAdmin/ 下面,就可通过 http://default.com/phpMyAdmin 访问了:
#复制 phpMyAdmin 目录
cp -a /usr/share/phpMyAdmin /home/wwwroot/default/
#替换连接形式为目录
rm -rf /home/wwwroot/default/phpMyAdmin/doc/html
cp -a /usr/share/doc/phpMyAdmin-<span class="pl-k">*</span>/html /home/wwwroot/default/phpMyAdmin/doc/
一键脚本
上面已经讲解了如何配置和安装,但是不能每次都这么一步一步来吧?为了节省时间,麦葱写了一个一键安装管理脚本,可选择安装 Nginx 1.8/1.9、 MySQL 5.5/5.6/5.7 和 PHP 5.5/5.6/7.0。
安装
yum install -y unzip
wget https://github.com/maicong/LNMP/archive/master.zip
unzip master.zip
cd LNMP-master
bash lnmp.sh
# 输出到指定文件
# bash lnmp.sh 2>&1 | tee lnmp.log
管理站点
service vhost (start,stop,list,add,edit,del,exit) <domain> <server_name> <index_name> <rewrite_file> <host_subdirectory>
start 启动
stop 停止
list 列出
add 添加
edit 编辑
del 删除
exit 什么都不做
<domain>: 配置名称,例如:domain
<server_name>: 域名列表,例如:domain.com,www.domain.com
<index_name>: 首页文件,例如:index.html,index.htm,index.php
<rewrite_file>: 伪静态规则文件,保存在 /etc/nginx/rewrite/ 例如:nomal.conf
<host_subdirectory>: 是否支持子目录绑定,on 或者 off
示例:
#添加一个标识为 domain 的站点
service vhost add domain domain.com,www.domain.com index.html,index.htm,index.php nomal.conf on
#启动标识为 domain 的站点
service vhost start domain
#停止标识为 domain 的站点
service vhost stop domain
#编辑标识为 domain 的站点
service vhost edit domain
#删除标识为 domain 的站点
service vhost del domain
#列出所有站点
service vhost list
备份数据
service vbackup (start,list,del) <delete name.tar.gz>
start 添加
list 列出
del 删除
示例:
#添加一个新的备份
service vbackup start
#列出备份文件
service vbackup list
#删除一个备份
service vbackup del name.tar.gz
6. 真心求助.nginx错误
Nginx服务器错误一般有以下几点原因:
1、请求的header过大。nginx默认的header长度上限是4k,如果超过了这个值,nginx会直接返回400错误.
解决方法:配置nginx.conf相关设置。可以通过以下2个参数来调整header上限:
client_header_buffer_size 16k;large_client_header_buffers 4 16k。
2、上传文件过程中出现错误。这时浏览器显示“413 Request Entity Too Large”。这是因为没有设置client_max_body_size,这个参数默认只是1M,也就是说发布的文章内容大小不能超过1M。
解决方法:增加如下两行到nginx.conf的http{}段, 增大nginx上传文件大小限制:设置允许发布内容为8M:client_max_body_size 8M;client_body_buffer_size 128k。
另外如果运行的是php,那么还要检查php.ini,这个大小client_max_body_size要和php.ini中的如下值的最大值一致或者稍大,这样就不会因为提交数据大小不一致出现的错误:post_max_size = 8M;upload_max_filesize = 6M。
修改完配置后,别忘记重新加载。
3、客户端在为等到服务器相应返回前就关闭了客户端描述符。一般出现在客户端设置超时后,服务器主动关闭。
解决方法:根据实际Nginx后端服务器的处理时间修改客户端超时时间。
4、脚本错误(php语法错误、lua语法错误)。
解决方法:查看nginx_err_log php_err_log。
5、访问量过大,系统资源限制,不能打开过多文件。 磁盘空间不足。(access log开启可能导致磁盘满溢,服务器主动关闭)。
解决方法:修改/etc/sysctl.conf文件,并使用下面的命令确认: #sysctl -p。要使 limits.conf 文件配置生效,必须要确保 pam_limits.so 文件被加入到启动文件中。
6、后端服务无法处理,业务中断。
解决方法:从后端日志获取错误原因,解决后端服务器问题。
7、后端服务器在超时时间内,未响应Nginx代理请求。
解决方法:根据后端服务器实际处理情况,调正后端请求超时时间。
8、网站页面缓存过大。
解决方法:配置nginx.conf相关设置:fastcgi_buffers 8 128k;send_timeout 60。
7. linux 中 系统是怎样利用/run/shm的请高手指点
tmpfs是Linux/Unix系统上的一种基于内存的文件系统。tmpfs可以使用您的内存或swap分区来存储文件。由此可见,tmpfs主要存储暂存的文件。它有如下2个优势 : 1. 动态文件系统的大小。2. tmpfs 的另一个主要的好处是它闪电般的速度。因为典型的 tmpfs 文件系统会完全驻留在内存 RAM 中,读写几乎可以是瞬间的。同时它也有一个缺点 tmpfs 数据在重新启动之后不会保留,因为虚拟内存本质上就是易失的。所以有必要做一些脚本做诸如加载,绑定的操作。
1
/dev/shm/是一个设备文件,它使用就是tmpfs文件系统(注意:在Centos和Redhat下,/dev/shm目录是一个链接,指向/run/shm目录,在Ubuntu系统下tmpfs文件系统对应的是/run/shm目录,可以使用df命令查看),因为 /dev/shm/这个目录不在硬盘上,而是在内存里,它就所谓的tmpfs。在Redhat/CentOS等linux发行版中默认大小为物理内存的一半。 比如我的的Red Hat Enterprise Linux Server 5.4 64(单核,512内存)分配内存为512M,所以/dev/shm为250M左右,查看/dev/shm如下:
[root@AY1212111202285f63122 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda1 20G 7.6G 11G 42% /
tmpfs 250M 0 250M 0% /dev/shm
2
tmpfs是基于内存的文件系统,创建时不需要使用mkfs等初始化。如我想把/dev/shm tmpfs大小改为512M,修改/etc/fstab中的
tmpfs /dev/shm tmpfs defaults 0 0
改为
tmpfs /dev/shm tmpfs,defaults,size=512m 0 0
3
然后执行mount -o remount /dev/shm
[root@AY1212111202285f63122 ]# mount -o remount /dev/shm
[root@AY1212111202285f63122 ]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda1 20G 7.6G 11G 42% /
tmpfs 512M 0 512M 0% /dev/shm
4
tmpfs(/dev/shm)的使用及应用场景:
tmpfs是基于内存的,速度是不用说的,硬盘和它没法比。Oracle 中的Automatic Memory Management特性就使用了/dev/shm。另外如果在网站运维中好好利用tmpfs,将有意想不到的收获。我们先在/dev/shm建一个tmp目前,并与/tmp绑定。
[root@AY1212111202285f63122 ~]# mkdir /dev/shm/tmp
[root@AY1212111202285f63122 ~]# chmod 1777 /dev/shm/tmp //注意权限
[root@AY1212111202285f63122 ~]# mount --bind /dev/shm/tmp /tmp
[root@AY1212111202285f63122 ~]# ls -ld /tmp
drwxrwxrwt 2 root root 40 May 29 21:46 /tmp
以下/tmp使用tmpfs文件系统的一些应用示例,一般tmpfs内存文件系统在做web缓存,临时文件存储时会对web访问有很好的加速作用,从而提高网站访问的速度。
5
将php的session文件放在/tmp下
对于一个访问量大的以apache php的网站,可能tmp下的临时文件都会很多,比如seesion或者一些缓存文件,那么你可以把它保存到tmpfs文件。保存seesion的方法很简单了:只要修改php.ini就行了,通过phpinfo测试文件查看你的php session存储位置,如果不在/tmp下,修改php.ini文件,修改如下:
session.save_path = “/tmp”
6
将服务的socket文件放在/tmp下
如nginx.socket和mysql.sock
至于tmpfs的其他应用,我想大家可能通过这篇文章会有所启发。再次强调下:tmpfs 数据在重新启动之后不会保留,重启tmpfs 数据会丢失,所以有必要做一些脚本做诸如加载,绑定的操作!
END
注意事项
tmpfs不具备持久性,重启后数据不保留,请务必注意
8. 使用php如何获取微信文章
可以尝试使用DOM操作库simple-html-dom.php,快速获取HTML结构的内容:
<?php
require dirname(__FILE__).'/simple_html_dom.php';
$html = file_get_html('http://php.net/');
$articles = array();
foreach($html->find('article.newsentry') as $article) {
$item['time'] = trim($article->find('time', 0)->plaintext);
$item['title'] = trim($article->find('h2.newstitle', 0)->plaintext);
$item['content'] = trim($article->find('div.newscontent', 0)->plaintext);
$articles[] = $item;
}
print_r($articles);
可以把抓取到的内容写入置于内存上的SQLite(/run/shm/php/crawler.db3),避免频繁的磁盘IO.
9. PHP的扩展模块怎么添加
在PHP/etc 文件夹中加入扩展
在PHP 文件夹下的php.ini文件里 有很多dll文件的地方加入一行 你所添加的扩展的名字xxxx.dll
或者 是 在php.ini中直接打开对应的扩展 ,将目标行的 ; 给去掉
哦,对了,最后记得要重新启动PHP的服务器
10. swoole 怎么在nginx下运行
swoole 框架的性能在使用nginx和php-fpm的时候并没有大的提升,如果使用app_server,据作者说性能较php-fpm有2倍的提升。
app_server.php使用官方例子:
<?php
define('DEBUG','on');
define("WEBPATH",realpath(__DIR__.'/../'));
requiredirname(__DIR__).'/libs/lib_config.php';
$server=::create(__DIR__.'/swoole.ini');
$server->setAppPath(WEBPATH.'/apps/');//设置应用所在的目录
$server->setDocumentRoot(WEBPATH);
$server->setLogger(newSwooleLogEchoLog(__DIR__."/webserver.log"));//Logger
//$server->daemonize();//作为守护进程
$server->run(array('worker_num'=>1,'max_request'=>5000,'log_file'=>'/tmp/swoole.log'));
重点来了,nginx配置:
location/{
if(!-e$request_filename){
proxy_passhttp://127.0.0.1:8888;
}
}
location~.*.(php|php5)?${
proxy_passhttp://127.0.0.1:8888;
#fastcgi_pass127.0.0.1:8888;
#fastcgi_passunix:/dev/shm/php-cgi.sock;
#fastcgi_indexindex.php;
#includefastcgi.conf;
}
其实有了第一条配置就可以正常访问了(除了首页),增加第二条主要是为了访问首页。