php53mysql
‘壹’ Undefined variable: sql in D:\phpStudy\php53\1.php on line 16
第16行的$sql变量未定义就直接使用了字符串连接。
$sql.=",(null,'$username','$password')";
这句话等于:
$sql=$sql.",(null,'$username','$password')";
这时候等号后面的$sql就是个未定义变量,所以报了错。
正确做法应该在前面声明这个变量是个字符串:
$sql='';
$sql.=",(null,'$username','$password')";
‘贰’ PHP如何读取mysql时间格式
使用函式 date() 实现
<?php echo $showtime=date("Y-m-d H:i:s");?>
显示的格式: 年-月-日 小时:分钟:秒
相关时间参数:
a - "am" 或是 "pm"
A - "AM" 或是 "PM"
d - 几日,二位数字,若不足二位则前面补零; 如: "01" 至 "31"
D - 星期几,三个英文字母; 如: "Fri"
F - 月份,英文全名; 如: "January"
h - 12 小时制的小时; 如: "01" 至 "12"
H - 24 小时制的小时; 如: "00" 至 "23"
g - 12 小时制的小时,不足二位不补零; 如: "1" 至 12"
G - 24 小时制的小时,不足二位不补零; 如: "0" 至 "23"
i - 分钟; 如: "00" 至 "59"
j - 几日,二位数字,若不足二位不补零; 如: "1" 至 "31"
l - 星期几,英文全名; 如: "Friday"
m - 月份,二位数字,若不足二位则在前面补零; 如: "01" 至 "12"
n - 月份,二位数字,若不足二位则不补零; 如: "1" 至 "12"
M - 月份,三个英文字母; 如: "Jan"
s - 秒; 如: "00" 至 "59"
S - 字尾加英文序数,二个英文字母; 如: "th","nd"
t - 指定月份的天数; 如: "28" 至 "31"
U - 总秒数
w - 数字型的星期几,如: "0" (星期日) 至 "6" (星期六)
Y - 年,四位数字; 如: "1999"
y - 年,二位数字; 如: "99"
z - 一年中的第几天; 如: "0" 至 "365"
可以自由设定显示的内容,连接符号或是显示位置,例如 date("m-d H") 或者date("dmY");?>等php中的日期处理
加入时间:2004-12-18 17:35:22 大小:12 KB 阅读次数:1405PHP中的日期处理
转贴:xiaxia 日期:2004-05-26 人气:9
我正打算用PHP编写一种帮助处理系统。我发现我必须知道处理完最后一位客户的问题后已经过去了多长时间?当我过去用ASP时解决这个问题相当简单,ASP有相应的函数DateDiff可以给出两个日期间间隔多少月、多少天和多少秒。当我搜寻完PHP手册后我发现PHP并没有类似的函数。
本文包含以下内容:
1、 得到目前的日期和时间-我们有多少种方式?
2、 改变日期显示的方式-日期和时间的显示形式
3、 转换现在的日期为Unix的时间戳值
4、 改变日期
a. 增加时间
b. 减去时间
c. 找出两日期之间的间隔
5、 为PHP添加DateAdd函数
6、 为PHP添加DateDiff函数
**得到目前的日期和时间
在Unix中,时间的表示方式为计算从1970年1月1日零时起所过去的秒数,这称为UNIX 时间戳(Unix Epoch)。
如果我们有这样一段的代码:
?
echo time();
?
将返回值958905820
而此时的时间为2000年5月21日12时43分。
你也许会说这相当不错。当这对我毫无帮助,或者只有一点帮助。在PHP中,对日期处理的函数都必须用到由time()返回的时间戳值。同时,由于PHP在Unix和Windows系统中均使用同样的时间戳值,这就允许你不需要修改代码即可在不同的系统间移植。另外的一个好处是time()函数返回的是一个整数,你可以将其作为整数字段或文本字段存入数据库,而不必使用特别的日期/时间字段。
你已经基本了解了Unix的时间戳值,现在让我们来展示它的实际用途。
改变日期显示的方式-日期和时间的显示形式
PHP提供两个办法来将Unix的时间戳值转换成为有用的数据。第一个是date()函数。这个函数有两个参数-第一个字符串用于设定你所希望返回的格式,第二个为Unix的时间戳值。
格式化字符串通过一些简单的特殊格式化字符来显示你所希望看到的格式的日期和时间。假设你希望日期以这样的格式显示“18h01 Sunday 21 May”。
我们需要对字符串中的每一部分使用一个特殊格式化字符,你可以从PHP手册中日期和时间函数库中找到。这样的特殊格式化字符数量不少,他们所表示的类似于星期几、月的英文名、用2位或4位数表示的年份,是否是上午(AM)或下午(PM)以及其他。对于这个例子我们需要的特殊字符为:
‘H’ -24 小时制的小时
‘i’- 分钟
‘l’- 星期几的英文全名
‘d’- 本月的第几日
‘F’- 月份的英文全名
因此我们的格式化字符串为”Hhi l d F”, PHP代码为:
?
echo date ("Hhi l d F" ,time());
?
当我们执行这段代码,我们发现我们所得到的结果为:
180609 Sunday 21 May
这样的结果看起来有些奇怪。让我们再查一下PHP手册,原来’h’所代表的是12 小时制的小时数。这再次证明了一句真理:“计算机只做你所告诉它该做的,而不是你想要它做的”。我们有两个选择。第一个是在h前使用转义字符“”:
echo date ("Hhi l d F", time());
我们得到这样的结果:
18h12 Sunday 21 May
这正是我们所要的。但如果我们在一个十分复杂的句子中需要包含日期和时间,我们是否需要对每个字符使用转义字符?
答案当然是不。我们使用另一个函数strftime()。
strftime()有两个好处。第一个好处我们并不在本文讨论范围内-如果你使用setlocale()函数,你可以通过strftime得到相应语言的月份的名称。另外的一个好处是你可以将特别的日期和时间的格式化字符包含在你的字符串中。这同时也意味着无论你是否要学习date()函数的所有特殊格式化字符,你都必须学习一整套完全不同的格式化字符。
strftime()工作的方式和date()没有什么不同,除了特殊格式化字符的前面必须添加一个百分号%。如果用strftime()函数,前面例子的代码如下:
?
echo strftime ("%Hh%M %A %d %b" ,time());
?
结果为:
18h24 Sunday 21 May
这也许看起来将简化繁,但考虑一下如果你所需要的显示的为"Today is Sunday 21 May 2000. The time is somewhere close to 18h24." 我想使用date()函数无疑令人感到厌烦。
在开始的时候,我提及我们有两种方式可以从Unix时间戳值中得到有用的数据。我们刚刚了解了date()和strftime()。另一个getdate()。这个函数只需要Unix 的时间戳值作为参数,而函数的返回值为日期和时间的数组。
下面是一个例子:
?
$date_time_array = getdate (time());
echo $date_time_array[ "weekday"];
?
返回的结果为:
Sunday
除了"weekday",该数组的其他部分为:
"seconds" –秒
"minutes" –分
"hours" –小时
“mday" - 本月的第几天
"wday" -本周的第几天(数字)
"mon" -月(数字)
"year" –年
"yday" - r本年的第几天(数字)
"month" -月份全名
我们现在可以得到容易辨认的日期和时间。那么其他呢?
**转换现在的日期为Unix的时间戳值
通常你必须处理一些日期或时间格式的数据。打开M$的一个Access数据库,所有的日期都以YYYY/MM/DD的格式存储,加入目前的日前即为2000/05/27。Mktime()函数可以将一个时间转换成Unix的时间戳值。
函数的格式为:int mktime(int hour, int minute, int second, int month, int day, int year, int [is_dst] );
从左往右你必须提供小时、分、秒、月、天和年。最后一个参数用于指定你是否处于夏令时,此参数是可选的,所以我们将忽略它。
代码如下:
?
echo mktime (0, 0,0 ,5, 27,2000 );
?
由于不知道小时、分和秒同时这些参数必须填写,我将其设置为0。设置为0意味着时间为午夜。
?
$access_date = "2000/05/27";
//explode()函数用一个字符串作为分界来分解另一个字符串。这个例子$access_date通过字符串”/”来分解
$date_elements = explode("/" ,$access_date);
// 此时
// $date_elements[0] = 2000
// $date_elements[1] = 5
// $date_elements[2] = 27
echo mktime (0, 0,0 ,$date_elements [1], $date_elements[ 2],$date_elements [0]);
?
我们看一个比从Access数据库单纯获得日期更复杂的情况,我们得到一个以下格式的日期和时间:2000/05/27 02:40:21 PM
?
// 来自Access的字符串
$date_time_string = "2000/05/27 02:40:21 PM";
// 将字符串分解成3部分-日期、时间和上午/下午
$dt_elements = explode(" " ,$date_time_string);
// 分解日期
$date_elements = explode("/" ,$dt_elements[ 0]);
// 分解时间
$time_elements = explode(":" ,$dt_elements[ 1]);
// 如果是下午,我们将时间增加12小时以便得到24小时制的时间
if ($dt_elements [2]== "PM") { $time_elements[ 0]+=12;}
// 输出结果
echo mktime ($time_elements [0], $time_elements[ 1], $time_elements[ 2], $date_elements[1], $date_elements[2], $date_elements[0]);
?
**修改日期
有时我们需要知道6小时以后是什么时间,35天前的日期或者从你最后一次玩Quake3后已过去多少秒。我们已经知道如何用mktime()函数从单独的日期和时间中获得Unix的时间戳值。如果我们需要的并非目前日期和时间的Unix时间戳值,我们该咋办?下面是一些练习可以帮助说明我们后面所要做的。
正如前面所见,mktime()使用以下参数:小时、分、秒、月、天和年。想想第二节,getdate()函数可以为我们获得这些参数。
?
// 将目前的时间戳值放入一数组内
$timestamp = time();
echo $timestamp;
echo "p";
$date_time_array = getdate( $timestamp);
// 用mktime()函数重新产生Unix时间戳值
$timestamp = mktime($date_time_array ["hours"], $date_time_array["minutes" ],$date_time_array[ "seconds"],$date_time_array ["mon"], $date_time_array["mday" ],$date_time_array[ "year"]);
echo $timestamp;
?
看起来有一些令人感到迷惑。我将用一些变量来使上面的程序看起来更容易了解。
?
// 将目前的时间戳值放入一数组内
$timestamp = time();
echo $timestamp;
echo "p";
$date_time_array = getdate( $timestamp);
$hours = $date_time_array[ "hours"];
$minutes = $date_time_array["minutes"];
$seconds = $date_time_array[ "seconds"];
$month = $date_time_array["mon"];
$day = $date_time_array["mday"];
$year = $date_time_array["year"];
// 用mktime()函数重新产生Unix时间戳值
$timestamp = mktime($hours ,$minutes, $seconds,$month ,$day,$year);
echo $timestamp;
?
现在我们将由getdate()所产生的时间戳值放入相对应的名称变量中,所以代码变得相对容易阅读和理解。现在如果我们需要在目前的时间上加上19个小时,我们用$hours+19代替mktime()函数中的$hours。mktime()将自动为我们将时间转到第二天。
?
// 将目前的时间戳值放入一数组内
$timestamp = time();
echo strftime( "%Hh%M %A %d %b",$timestamp);
echo "p";
$date_time_array = getdate($timestamp);
$hours = $date_time_array["hours"];
$minutes = $date_time_array["minutes"];
$seconds = $date_time_array["seconds"];
$month = $date_time_array["mon"];
$day = $date_time_array["mday"];
$year = $date_time_array["year"];
// 用mktime()函数重新产生Unix时间戳值
// 增加19小时
$timestamp = mktime($hours + 19, $minutes,$seconds ,$month, $day,$year);
echo strftime( "%Hh%M %A %d %b",$timestamp);
echo "br~E after adding 19 hours";
?
运行后得到:
14h58 Saturday 03 Jun
09h58 Sunday 04 Jun
~E after adding 19 hours
减少时间也是同样的-你只需要减少相应变量的值即可。
得到两个不同时间值的差同样也是非常简单。你所需要做的只是将两个时间值转换为Unix的时间戳值,然后两者相减即可。两者之差即为两个时间所相隔的秒数。另外一些算法可以很快地将秒转为天、小时、分和秒。
**为PHP添加DateAdd函数
正如在文章一开始我所说的-写本文的原因是因为我在PHP中找不到类似ASP的DateDiff函数。在介绍完PHP是如何处理日期和时间,让我们将ASP中常用的两个函数移植到PHP。第一个函数是DateAdd。
根据Vbscript的文档,DateAdd(interval,number,date)函数的定义为“返回已添加指定时间间隔的日期。”
Inetrval为表示要添加的时间间隔字符串表达式,例如分或天;number为表示要添加的时间间隔的个数的数值表达式;Date表示日期。
Interval(时间间隔字符串表达式)可以是以下任意值:
yyyy year年
q Quarter季度
m Month月
y Day of year一年的数
d Day天
w Weekday一周的天数
ww Week of year周
h Hour小时
n Minute分
s Second秒
w、y和d的作用是完全一样的,即在目前的日期上加一天,q加3个月,ww加7天。
?
function DateAdd ($interval, $number, $date) {
$date_time_array = getdate($date);
$hours = $date_time_array["hours"];
$minutes = $date_time_array["minutes"];
$seconds = $date_time_array["seconds"];
$month = $date_time_array["mon"];
$day = $date_time_array["mday"];
$year = $date_time_array["year"];
switch ($interval) {
case "yyyy": $year +=$number; break;
case "q": $month +=($number*3); break;
case "m": $month +=$number; break;
case "y":
case "d":
case "w": $day+=$number; break;
case "ww": $day+=($number*7); break;
case "h": $hours+=$number; break;
case "n": $minutes+=$number; break;
case "s": $seconds+=$number; break;
}
$timestamp = mktime($hours ,$minutes, $seconds,$month ,$day, $year);
return $timestamp;}
?
我们可以将上面的代码保存为dateadd.inc文件,然后运行以下代码:
?
include('dateadd.inc');
$temptime = time();
echo strftime( "%Hh%M %A %d %b",$temptime);
$temptime = DateAdd("n" ,50,$temptime);
echo "p";
echo strftime( "%Hh%M %A %d %b",$temptime);
?
我们将得到:
15h41 Saturday 03 Jun
16h31 Saturday 03 Jun
为PHP添加DateDiff函数
现在DateAdd已经完成,那么DateDiff呢?
根据文档,DateDiff(interval,date1,date2)函数的定义为“返回两个日期之间的时间间隔”。
Intervals参数的用法与DateAdd函数中的相同。出于避免过于复杂的考虑,我们决定忽略Vbscript中DateDiff函数中其它复杂的参数,即其两个可选的参数变量[firstdayofweek[, firstweekofyear]](它们用于决定星期中第一天是星期天还是星期一和一年中第一周的常数。而且我们只允许intervals有以下五个值:"w"(周)、"d"(天)、"h"(小时)、"n"(分钟) 和"s"(秒)。
Let's see what we can come up with: 下面的代码是我们所需要的:
?
Function DateDiff ($interval, $date1,$date2) {
// 得到两日期之间间隔的秒数
$timedifference = $date2 - $date1;
switch ($interval) {
case "w": $retval = bcdiv($timedifference ,604800); break;
case "d": $retval = bcdiv( $timedifference,86400); break;
case "h": $retval = bcdiv ($timedifference,3600); break;
case "n": $retval = bcdiv( $timedifference,60); break;
case "s": $retval = $timedifference; break;
}
return $retval;}
?
将上面的代码存为datediff.inc文件,然后运行下面的代码:
?
include('datediff.inc');
include('dateadd.inc');
$currenttime = time();
echo "Current time: ". strftime("%Hh%M %A %d %b" ,$currenttime)."br";
$newtime = DateAdd ("n",50 ,$currenttime);
echo "Time plus 50 minutes: ". strftime("%Hh%M %A %d %b" ,$newtime)."br";
$temptime = DateDiff ("n",$currenttime ,$newtime);
echo "Interval between two times: ".$temptime;
?
如果一切顺利,你可以看到以下结果:
Current time: 16h23 Saturday 03 Jun
Time plus 50 minutes: 17h13 Saturday 03 Jun
Interval between two times: 50
如果你在Unix机器上运行PHP,你必须编译PHP支持BC高精度函数。你必须从以下地址http://www.php.net/extra/number4.tar.gz下载BC库,然后将其解压到PHP4的根目录下,重新编译PHP,编译时要加上--enable-bcmath的选项。(详细说明见PHP4中README.BCMATH)。PHP4的Windows版本则不需要做任何修补即可直接使用BC高精度函数。
现在你已经得到处理日期和时间的函数,剩下的就是如何将其运用到你的PHP程序中。
php时间显示例
加入时间:2004-12-18 17:22:53 大小:1 KB 阅读次数:1564
第一种:简单(供学习用)
<?PHP
$today=date("Y-m-d G:i:s");
echo "<center>$today</center>";
?>
第二种:
/*
Format Time
*/
Function formatTime($time,$type="1"){
switch($type){
case 1;#2002-06-0418:58 Tuesday
return date("Y.m.d H:i",$time)."<font color=blue>".date(" l",$time)."</font>";
case 2;#June 2002
return date("M Y",$time);
case 3;#2002-06-04 18:58
return date("Y.m.d H:i",$time);
case 4;#06-04 AM
return date("m-d A",$time);
case 5;#06-04 18:58
return date("m.d H:i",$time);
}
}不知道对于两个以字符串格式存储的日期得比较会有什么结果,例如 ‘2007-07-12′ ‘2007-06-27′ ,这种日期最好用什么方法来比较呢?就大小而论
leehao July 17th, 2006 1:33 am
/*日期比较*/
$Date_1="2007-07-12";
$Date_2="2007-06-27";
/*
首先用explode这个函数来拆分字符串
explode("这引号里面是条件来的哦,改成:就会用:来拆分字符串的,可以应用到很多方面去的",后面要拆分的字符串)
*/
$Date_explode_1=explode("-",$Date_1);
$Date_explode_2=explode("-",$Date_2);
/*
拆分后的字符串,我们通过使用mktime函数来计算时间,
必须说明一下的是mktime计算出来的时间是用秒来算的哦,
后面就简单啦,具体可以看手册,里面详细得很
*/
$Day_1=mktime(0,0,0,$Date_explode_1[1],$Date_explode_1[2],$Date_explode_1[0]);
$Day_2=mktime(0,0,0,$Date_explode_2[1],$Date_explode_2[2],$Date_explode_2[0]);
$Days=round(($Day_1-$Day_2)/3600/24);
echo "您要的结果是 $Days 天哦";
?>
请问如何得到90天以后的日期
加入时间:2004-12-18 18:09:53 大小:1 KB 阅读次数:158
//获取今天的时间信息
$Y=date(Y);
$m=date(m);
$d=date(d);
//$m为月,$d为天,$Y为年,"+"号表示之后,用"-"号可以得到多少天前的日期,"Y年m月d日",只是显示的格式,你可以改成"Y-m-d",
$out_date1=date( "Y年m月d日", mktime(0,0,0,$m,$d+7,$Y) );//一周后
$out_date2=date( "Y年m月d日", mktime(0,0,0,$m,$d+14,$Y) );//二周后
$out_date3=date( "Y年m月d日", mktime(0,0,0,$m+1,$d,$Y) );//一个月后
$out_date4=date( "Y年m月d日", mktime(0,0,0,$m+2,$d,$Y) );//二个月后
$out_date5=date( "Y年m月d日", mktime(0,0,0,$m+3,$d,$Y) );//三个月后
$out_date6=date( "Y年m月d日", mktime(0,0,0,$m+6,$d,$Y) );//六个月后
$out_date7=date( "Y年m月d日", mktime(0,0,0,$m,$d,$Y+1) );//一年后
echo date("Ymd", time() + 90*86400);
echo date("Y-m-d",strtotime("2004-10-26 +90day"));
date("Y-m-d",strtotime("+90 day"));
‘叁’ 如何在一台windows的服务器里安装配置PHP+MYSQL环境
php5.3以下版本的安装方法。
1、首先是下载PHP安装文件和MYSQL安装文件,不过请注意MYSQL有很多个版本,有社区版、标准版、企业版、集群版,其中只有社区版是免费的。
2、在服务器上配置好IIS,这里推荐IIS7以上版本,控制面板-打开或关闭windows功能-万维网服务-应用程序开发功能里选上对应就可安装。
3、配置php环境:把php压缩包解压到C:\php目录下面,然后找到php.ini-dist,把他更名为php.ini,
修改里面的扩展目录
extension_dir = “C:\php\ext\”。
把以下扩展前面的分号去掉以启用
extension=php_curl.dll
extension=php_gd2.dll
extension=php_mysql.dll
fastcgi.impersonate=1 默认为0,如果使用IIS,需要开启
cgi.fix_pathinfo=1
cgi.force_redirect=0 默认开启,如果使用IIS,可以将其关闭
其次指定extension_dir目录和date.timezone,即
extension_dir = "C:/php53iis/ext"
date.timezone= Asia/Shanghai
4、然后把extension=php_mysql.dll前面的分号去掉,保存并把php.ini复制到系统Windows目录下面。
5、然后依次打开电脑(右键)->管理->服务和应用程序->Internet信息服务(IIS)管理器,打开ISAPI和CGI限制,然后添加php的ISAPI的执行文件php5isapi.dll.
6、配置Mysql:把下载的mysql文件直接安装即可,然后复制php目录下面的libmysql.dll到系统Windows下面的System32目录里。
7、重启IIS,即完工。
当然还有一种方法是使用PHP Manager,步骤大致如下:
1、下载并安装PHP Manager。
2、开启IIS,会发现里面多了一个PHP Manager图标项了。
3、下载php并解压到想要放置的位置,将php.ini-development改名为php.ini ,修改php.ini 查找data.timezone
修改为date.timezone = “Asia/Shanghai”(这里必须改,不然会出警告) ,找到Windows Extensions开启
所需模块,如:php_curl.dll php_mysql.dll php_mysqli.dll php_xmlrpc.dll
php_curl.dll,去掉前面的 分号 保存就可以了。
4、回到IIS界面,双击PHP Manager后,点击“Register new PHP
Version”,然后选择好php目录中的php-cgi.exe,然后php.ini就会为适合IIS7.5的配置默认给你生成好了。
5、在当前界面点一下“Check phpinfo()”就会出现PHPInfo页面了!
‘肆’ 请问PHP怎样用面向对象方式连接MySQL数据库
<?php
$servername="localhost";//你的连接地址,可以是ip
$username="username";//你的用户名
$password="password";//你的密码
$dbname="myDB";//你要连接数据库的名字
//创建连接
$conn=newmysqli($servername,$username,$password,$dbname);
//检测连接
if($conn->connect_error){
die("连接失败:".$conn->connect_error);
}
echo"连接成功";
学习可以参考:http://www.runoob.com/php/php-mysql-select.html
‘伍’ php5.3配什么版本的mysql
1. php5.3.2要用什么mysql版本?有没有什么特殊要求?
推荐使用mysql5以上的版本,貌似没有什么特殊要求。
2. 还有一定要运行在fastcgi模式吗 不能用之前的iis6那种简单的吗
可以使用iis6,在php的各版本中,VC6版本对应Apache平台,Vc9版本对应IIS平台; Thread Safety版本,推荐ISAPI方式运行, Non Thread Safety版本,推荐使用FastCGI运行。
FastCGI是CGI的增强版本,IIS6也可以使用FastCGI,安装也挺简单,官方推荐使用FastCGI。
‘陆’ 怎么将php与数据库连接
php链接mysql必备条件:
已安装mysql数据库;
检查php环境是否已开启mysql扩展(一般情况下是开启的);
检查方法:a.使用phpinfo();函数,看有没有mysql项;b.打开php.ini文件,检查php_mysql.dll前分号是否已取掉。
php链接代码如下:
<?php
//设置编码格式
header("Content-type:text/html;charset=utf-8");
//定义数据库主机地址
$host="localhost";
//定义mysql数据库登录用户名
$user="root";
//定义mysql数据库登录密码
$pwd="";
//链接数据库
$conn = mysql_connect($host,$user,$pwd);
//对连接进行判断
if(!$conn){
die("数据库连接失败!".mysql_errno());
}else{
echo "数据库连接成功!";
}
?>
‘柒’ 你的 PHP MySQL 库版本 5.0.51a 和你的 MySQL 服务器版本 5.1.55 不同。这可能造成一些未知的问题
PHP MySQL 库版本 5.0.51a 是指的libmysql.dll库文件和php_mysql.dll这个文件版本低了,最好升级一下php,升到5.2.13以上的应该会没问题
‘捌’ php 5.6.3如何扩展支持mysql
我就是5.6.3,跟以前版本一样没有什么区别。
就是吧
extension=mysql.so
extension=pdo_mysql.so
前面的注释去掉就可以了。
‘玖’ 如何在 OSX 上架设 Nginx+MariaDB+PHP 服务器
打开“Mac App Store”下载并安装“Xcode”。
打开“Xcode”,按下同意并接受Xcode的使用条款。
打开“终端机(Terminal)”,输入下面的指令并且安装Homebrew。
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
输入下面的指令让其他程式知道Xcode的位置。
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
之后,“按此”下载最新版本的X11并且安装。
之后建立X11的符号链接(软链接)。
sudo ln -s /opt/X11 /usr/X11
之后使用下面的指令查看透过Homebrew安装的套件。
brew list
之后输入下面指令查看当前系统变数。
$PATH
打开“.bash_profile”并修改系统变数。
vim ~/.bash_profile
将“/usr/local/bin”放在“/usr/local/sbin”之前。例如︰
export PATH=~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11/bin:/usr/local/git/bin:/opt/local/bin
接着,请参考文章“[教学] 在 OSX 10.8 上设定 Postfix 邮件传送代理 (MTA)”设定Postfix。
启用Postfix。
sudo postfix start
安装 dnsmasq 设定 DNS
透过Homebrew安装dnsmasq,以加速网路存取速度。
brew install dnsmasq
复制和编辑dnsmasq.conf。
mkdir /usr/local/etc
cp $(brew --prefix dnsmasq)/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf
vim /usr/local/etc/dnsmasq.conf
更改dnsmasq.conf内的数值。
resolv-file=/etc/resolv.dnsmasq.conf
address=/.ld/127.0.0.1
listen-address=127.0.0.1
建立并编辑DNS解析文件。
sudo vim /etc/resolv.dnsmasq.conf
在“resolv.dnsmasq.conf”文件内贴上以下内容。
# Google DNS IPv6:
nameserver 2001:4860:4860::8888
nameserver 2001:4860:4860::8844
# OpenDNS IPv6:
nameserver 2620:0:ccd::2
nameserver 2620:0:ccc::2
# Google DNS:
nameserver 8.8.8.8
nameserver 8.8.4.4
# OpenDNS:
nameserver 208.67.222.222
nameserver 208.67.220.220
设定开机自动执行dnsmasq。
sudo cp $(brew --prefix dnsmasq)/homebrew.mxcl.dnsmasq.plist /Library/LaunchDaemons
sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
设定你的Hostname。
sudo scutil --set HostName foolegg
打开“系统设定”,在“网络”内分别选择“Wi-fi”和“Ethernet”,在“进阶”内设定“127.0.0.1”为DNS服务器。
安装 Nginx
输入下面指令关闭自动启用Apache。
sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist
之后透过Homebrew安装Nginx。
brew install nginx
安装完成后,复制和备份nginx.conf。
cp /usr/local/etc/nginx/nginx.conf /usr/local/etc/nginx/nginx.conf.bak
打开nginx.conf,删除所有内容,使用下面的内容取代。
# Nginx web server main configuration file nginx.conf
#
user www-data staff;
worker_processes 4;
worker_rlimit_nofile 8192;
error_log /usr/local/var/log/nginx/error.log;
#pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 10;
tcp_nodelay on;
gzip on;
client_max_body_size 100M;
#access_log /usr/local/var/log/nginx/access.log main;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
## FastCGI.
include /usr/local/etc/nginx/fastcgi.conf;
## For the filefield_nginx_progress mole to work. From the
## README. Reserve 1MB under the name 'uploads' to track uploads.
#upload_progress uploads 1m;
#include /etc/nginx/conf.d/*.conf;
#include /usr/local/etc/nginx/aegir.conf;
server {
listen 80;
server_name localhost;
server_tokens off;
#access_log /usr/local/var/log/nginx/access.log main;
root /usr/share/nginx/www/public_html;
location / {
root /usr/share/nginx/www/public_html;
index index.html index.htm;
##### Use this if you're going to install wordpress #####
#if (-f $request_filename/index.html) {
# rewrite (.*) $1/index.html break;
#}
#if (-f $request_filename/index.php) {
# rewrite (.*) $1/index.php;
#}
#if (-f $request_filename) {
# rewrite (.*) /index.php;
#}
#if (!-e $request_filename) {
# rewrite ^.+?(/wp-.*) $1 last;
# rewrite ^.+?(/.*\.php)$ $1 last;
# rewrite ^ /index.php last;
#}
#rewrite /wp-admin$ $scheme://$host$uri/ permanent;
##### End #####
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/www/public_html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
之后建立Nginx的log资料夹和其它必要的目录。
sudo mkdir -p /usr/local/var/log/nginx/
touch /usr/local/var/log/nginx/error.log
touch /usr/local/var/log/nginx/access.log
sudo mkdir -p /usr/share/nginx/www/public_html
安装 MariaDB
透过Homebrew安装MariaDB。
brew install mariadb --use-llvm --env=std
取消TMPDIR设定。
unset TMPDIR
初始化MySQL数据库。请将5.5.30更改为你当前使用的版本编号。
cd /usr/local/Cellar/mariadb/5.5.30/scripts
mysql_install_db --user=`whoami` --basedir="$(brew --prefix mariadb)" --datadir=/usr/local/var/mysql --tmpdir=/tmp
系统会提示错误,请忽略有关错误。下面的教学设定会更正错误。
安装 PHP
虽然OSX上已经安装了PHP,但是我们不会使用Apple的PHP。
输入下面的指令安装PHP。
brew tap josegonzalez/homebrew-php
brew tap homebrew/pes
brew install php53 --with-mysql --with-fpm --with-imap
brew install php53-xhprof
brew install php53-xdebug
brew install php53-uploadprogress
brew install php53-memcached
brew install php53-imagick
打开并修改php.ini。
vim /usr/local/etc/php/5.3/php.ini
搜索
extension=php_zip.dll
在下面加上以下内容,请更改版本编号。
extension="/usr/local/Cellar/php53-xhprof/0.9.2/xhprof.so"
extension="/usr/local/Cellar/php53-uploadprogress/1.0.3.1/uploadprogress.so"
extension="/usr/local/Cellar/php53-memcached/2.1.0/memcached.so"
extension="/usr/local/Cellar/php55-imagick/3.1.0RC2/imagick.so"
zend_extension="/usr/local/Cellar/php53-xdebug/2.2.1/xdebug.so"
到“PHP手册”寻找你身处地区的时区。修改php.ini内的“date.timezone”变数的数值。
date.timezone = Asia/Hong_Kong
寻找以下3个变数的数值。如果找不到,请在档案的最尾部份加上3个变数和数值。
magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
修改记忆体和上传限制的数值。如果变量前出现分号“;”,请将之删除。
memory_limit = 256M
post_max_size = 100M
upload_max_filesize = 100M
打开并修改php-fpm.conf档案。
vim /usr/local/etc/php/5.3/php-fpm.conf
搜索
pid = run/php-fpm.pid
在下面加上
pid = /usr/local/var/run/php-fpm.pid
之后删除下面4行变数和数值前的分号“;”。
pm.start_servers = 3
pm.min_spare_servers = 3
pm.max_spare_servers = 5
pm.max_requests = 500
按照下面修改“error_log”的数值。
error_log = /usr/local/var/log/php-fpm.log
之后建立log的符号链接(软链接)。
sudo ln -s $(brew --prefix josegonzalez/php/php53)/var/log/php-fpm.log /usr/local/var/log/php-fpm.log
开机启用服务
设定Nginx的启用服务。
sudo cp $(brew --prefix nginx)/homebrew.mxcl.nginx.plist /Library/LaunchDaemons/
sudo chown root:wheel /Library/LaunchDaemons/homebrew.mxcl.nginx.plist
打开并修改“homebrew.mxcl.nginx.plist”。
sudo vim /Library/LaunchDaemons/homebrew.mxcl.nginx.plist
在“homebrew.mxcl.nginx.plist”内删除以下内容。
<key>KeepAlive</key>
<true/>
<key>UserName</key>
<string>[YourUserName]</string>
开启Nginx。
launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.nginx.plist
为软件建立资料夹。
mkdir -p ~/Library/LaunchAgents
设定MariaDB的启用服务。
cp $(brew --prefix mariadb)/homebrew.mxcl.mariadb.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mariadb.plist
设定PHP的启用服务。
cp $(brew --prefix josegonzalez/php/php53)/homebrew-php.josegonzalez.php53.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew-php.josegonzalez.php53.plist
完成MariaDB的设定。
sudo $(brew --prefix mariadb)/bin/mysql_secure_installation
为MySQL设定密码。
Enter current password for root (enter for none): [Enter]
Set root password? [Y/n] y
New password: [password]
Re-enter new password: [password]
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y
测试PHP
建立并修改index.php。
vim /usr/share/nginx/www/public_html/index.php
输入并储存以下内容。
<?php phpinfo(); ?>
从新启动Nginx。
sudo nginx -s reload
打开浏览器,输入“http://localhost/index.php”查看是否成功运行PHP。
启动或停止MNMP
在桌面或其他位置建立Shell Script“mnmp.sh”。
vim mnmp.sh
在Shell Script“mnmp.sh”内加入以下内容,然后储存档案。
#!/bin/bash
case "$1" in
start)
# Start MariaDB
echo -e "Starting mariadb..."
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mariadb.plist
# Start PHP
echo -e "Starting php..."
launchctl load -w ~/Library/LaunchAgents/homebrew-php.josegonzalez.php53.plist
# Start Nginx
echo -e "Starting nginx..."
sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.nginx.plist
;;
stop)
# Stop MariaDB
echo -e "Stopping mariadb..."
launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mariadb.plist
# Stop PHP
echo -e "Stopping php..."
launchctl unload -w ~/Library/LaunchAgents/homebrew-php.josegonzalez.php53.plist
# Stop Nginx
echo -e "Stopping nginx..."
sudo launchctl unload -w /Library/LaunchDaemons/homebrew.mxcl.nginx.plist
;;
esac
exit 0
为Shell Script“mnmp.sh”加入可执行权限。
chmod 700 mnmp.sh
使用以下指令启动MNMP。
./mnmp.sh start
使用以下指令停止MNMP。
./mnmp.sh stop
PHP档案存取错误
有部份读者反映在存取PHP档案时出现错误。大家可以打开档案“/usr/local/var/log/nginx/error.log”查看错误的原因。
如果出现下面的原因,可能是因为php-fpm的问题。
[error] <NUMBER>#0: *<NUMBER> kevent() reported that connect() fa iled (<NUMBER>: Connection refused) while connecting to upstream, client: 127.0.0. 1, server: localhost, request: “GET /index.php HTTP/1.1″, upstream: “fastcgi ://127.0.0.1:9000″, host: “127.0.0.1″
大家可以使用“netstat -anp tcp | grep 9000”或者“lsof -i tcp:9000”查看占用Port 9000的进程,并且将其终止。之后使用下面指令开启php-fpm。
sudo /usr/local/sbin/php-fpm --fpm-config /usr/local/etc/php/5.3/php-fpm.conf
请再次测试是否成功存取php。如果成功,请依照下面设定自动启动php-fpm。
设定自动启动php-fpm
建立文件“~/Library/LaunchAgents/org.php-fpm.plist”。