在php中暂停代码执行一定时间,有两个函数可以实现,一个是sleep,另一个是usleep,它们参数都是一个整数值。sleep是暂停多少秒,usleep是暂停多少微秒。注意:usleep单位是微秒,1秒 = 1000毫秒 ,1毫秒 = 1000微秒,即1微秒等于百万分之一秒。
如果程序中要使用要暂停多少毫秒,只能使用usleep,务必注意参数的单位,假设暂停 50毫秒,应该使用usleep(50000),而不是usleep(50)。
另外,我的理解,这个暂停的时候不可能是百分百的准确,跟系统的调度,cpu时钟周期等等有一定关系。
最近在mac系统下安装zend studio作为php开发工具,把以前的代码导入,发现项目中有很多 “assignment in condition”的警告,造成原因是在条件判断的if、while中使用了如下类似的做法:
if ($res = $other)
while (($row = $res->fetchRow(DB_FETCHMODE_OBJECT)))
想去掉这个警告有多种方法,这里列出两种,第一种是从代码的角度,把代码写的更健壮,例如:
if (($res = $other) != FALSE)
while (($row = $res->fetchRow(DB_FETCHMODE_OBJECT)) != FALSE)
但是往往项目中会使用到第三方php代码,第三方代码可能会有大量这种警告,如果自己逐个修改,那还是一件比较麻烦的事,这里提供的第二种方法是通过修改zend studio设置,彻底忽略这类警告提示信息。
具体设置为,依次打开 偏好设置 –> PHP –> Semantic Analysis Properties,展开右边Potential Programmer Problems,在其下面可以找到“Assignment in condition(e.g. ‘if(a=b)’),把Warning修改Ignore,保存设置就彻底去掉这个警告提示了。
今天在mac上搭建好了php的环境,把先前在window、linux下运行良好的程序放在mac上,居然出现访问不了数据库,数据库连接的host用的是localhost,可以确认数据库配置是正确的,因为在java中使用localhost访问正常,另外通过命令行工具也能正常访问。当把localhost换成127.0.0.1或者本机的IP时,居然正常了。以前一直认为localhost与127.0.0.1是一回事,现在事实证明它们其中还是有区别的。
在网上搜索了一下它们的区别,有人已经说的很明白了,具体可以参看:http://blog.sina.com.cn/s/blog_40e1ba640100ivjj.html,http://www.diybl.com/course/7_databases/mysql/myxl/20090722/168062.html。它们的主要区别是localhost是通过socket方式来连接,而127.0.0.1则是走的TCP协议。
上面提到区别就是导致mac下无法连接数据库的原因。那为什么socket方式无法连接呢?由于mac os lion上已经自带了apache和php,我的环境使用就使用默认的,mysql服务是在官网下载dmg安装最近版本,php的配置文件(/ect/php.ini)中设置有三个地方(mysql.default_socket、mysqli.default_socket、pdo_mysql.default_socket)设置了mysql socket文件存放的位置,其默认值为/var/mysql/mysql.sock。查看mysql服务使用的socket文件有两种方式
方法1:
echo "show variables" | mysql | grep "socket"
方法二:
echo "status" | mysql | grep "socket"
注意:如果mysql设置了密码,使用-u,-p来指定用户名和密码
这里看到mysql的socket文件存放位置为/tmp/mysql.sock。
看到这儿应该知道问题所在了吧,使用localhost连接失败的原因为在socket的方式下,php默认配置的mysql服务的socket文件不存在,所以导致连接失败,如果把连接失败的错误信息dump出来,你应该会看到错误信息中包含了“No such file or directory”。
知道原因就容易修改了,只需要把php配置文件中mysql.default_socket、mysqli.default_socket、pdo_mysql.default_socket这三项值修改为mysql服务配置对应值即可,修改好后需要重启apache服务。当然也可以修改mysql配置文件中的socket信息,使其保持一致即可,修改好后重启mysql服务。
mac os lion 系统默认安装了apache和php,如果要在php中使用memcached,就需要自己安装扩展。本文采用源码方式来安装。php扩展有两种,一个是memcache,一个是memcached,下载地址为:
memcache:http://pecl.php.net/package/memcache
memcached:http://pecl.php.net/package/memcached
安装memcached,就需要安装先libmemcached,这里安装的是memcache。
在上述链接中选择下载一个源码,例如:memcache-2.2.6.tgz,解压并进入解压目录,先执行phpize,本人系统出现如下错误:
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
原因是系统没有安装autoconf,解决办法下载autoconf的源码,自己编译安装。autoconf的官方网址是:http://www.gnu.org/software/autoconf/。安装命令如下:
cd ~
mkdir tmp
cd tmp
curl http://ftp.gnu.org/gnu/autoconf/autoconf-2.68.tar.bz2 -o autoconf-2.68.tar.bz2
tar -xvf autoconf-2.68.tar.bz2
cd autoconf-2.68
./configure && make
sudo make install
安装好autoconf,下面就可以开始安装memcache扩展了,安装命令如下:
cd ~
mkdir tmp
cd tmp
curl http://pecl.php.net/get/memcache-2.2.6.tgz -o memcache-2.2.6.tgz
tar -xvf memcache-2.2.6.tgz
cd memcache-2.2.6
sudo phpize
sudo ./configure
sudo make
sudo make install
如果看到类似如下输出:
Installing shared extensions: /usr/lib/php/extensions/no-debug-non-zts-20090626/
表示编译成功。最后还需要修改php.ini,把如下信息添加进去:
extension=memcache.so
至此,php memcache扩展就编译安装成了,重启apache服务,就可以在php中使用memcache。
由于采用源码编译安装的方式,所有先要确认机器上已经安装了gcc,关于gcc的安装,可以参考:http://www.netingcn.com/mac-os-lion-gcc.html。
memcached依赖与libevent,所以要先安装libevent,听起来好像很麻烦的,但是有人写了一个shell脚本帮我们搞定了一切,只要执行该脚本,它就会自动下载、编译安装好。脚本的下载地址:http://topfunky.net/svn/shovel/memcached/install-memcached.sh 。打开终端,执行如下操作
cd ~
mkdir -pv tmp
cd tmp
curl http://topfunky.net/svn/shovel/memcached/install-memcached.sh -o install-memcached.sh
sh install-memcached.sh
不出意外的话,memcached就安装好了。注意:如果不是以root用户执行,期间可能需要提供当前用户的密码。memcached的版本定义在脚本中,如果想安装不同版本的memcached,可以自己修改一下下载地址即可。
启动memcached服务:
memcached -d -m 128 -l 127.0.0.1 -u root
其中
-d 以守护程序(daemon)方式运行 memcached;
-m 设置 memcached 可以使用的内存大小,单位为 M;
-l 设置监听的 IP 地址,如果是本机的话,通常可以不设置此参数;
-p 设置监听的端口,默认为 11211,所以也可以不设置此参数;
-u 指定用户,如果当前为 root 的话,需要使用此参数指定用户。
停止memcached服务:
killall memcached
OS 版本10.7.3,默认没有安装gcc的,搜索了一下,说只要安装xcode就会有gcc了,去app store下载安装了,此时在终端输入gcc,还是提示“command not found”,确认xcode也安装成功了,版本是4.3,网上搜索,基本上都是说安装就可以了,终于在一个不起眼的帖子中有人提到,还需要自己去下载安装command line tools。具体路径为:Xcode –> Preferences –> Downloads 的Components下,选择安装Command Line Tools 即可。
刚用苹果的系统,还是有些不太习惯,在window下当打开很多窗口,很容易回到桌面,经常琢磨,mac下也有类似功能,比如触摸板(四个指头分开)或快捷键(command+F3),也可shift+command+F3,这只是把窗口移动到左、右和上方边缘了,另外一种方法上通过快捷键option+command+H和command+M联合完成,第一个是先隐藏所有窗口,然后再最小化当前窗口。
mac os 下要卸载MySQL,只需要吧相应的文件删除即可
先切换到root,避免每个删除前都使用sudo
sudo su
rm /usr/local/mysql
rm -rf /usr/local/mysql*
rm -rf /Library/StartupItems/MySQLCOM
rm -rf /Library/PreferencePanes/My*
rm -rf /Library/Receipts/mysql*
rm -rf /Library/Receipts/MySQL*
rm -rf /var/db/receipts/com.mysql.*
vi /etc/hostconfig
删除 MYSQLCOM 定义
另外如果自己定制了MySQL的配置文件,删除/etc/my.cnf
mac os x 版本:10.7.3,在mysql的官网没有发现对应版本的下载,所以下载了一个mysql-5.5.22-osx10.6-x86_64.dmg,安装什么的都比较简单,安装好后,通过系统偏好设置设置中也能正常启动MySQL服务,同时在面板中取消了开机自动启动服务。本人比较喜欢在命令行中操作,看到ReadMe.txt中的介绍,可以使用/Library/StartupItems/MySQLCOM/MySQLCOM来执行启动、停止和重启操作。
sudo /Library/StartupItems/MySQLCOM/MySQLCOM stop
服务正常停止
sudo /Library/StartupItems/MySQLCOM/MySQLCOM start
这时终端没有任何输出,服务也没有起来。
无法通过命令行启动,以为安装的有什么问题,在网上搜了一把,发现一篇官方bugs报告文章:http://bugs.mysql.com/bug.php?id=42673,也没有解决问题。经过一番周折,最后终于在/Library/StartupItems/MySQLCOM/MySQLCOM这个脚本中发现了问题,
StartService ()
{
if [ "${MYSQLCOM:=-NO-}" = "-YES-" ] ; then
ConsoleMessage "Starting MySQL database server"
$SCRIPT start > /dev/null 2>&1
fi
}
注意:在执行启动命令前作了一个判断,变量MYSQLCOM是定义在/etc/hostconfig中的,他的作用是设置MySQL是否开机自动启动,由于刚才在面板中把它设置为否,所以其值为-NO-,因而那个if就条件为FALSE,所以根本没有执行启动命令。通过看这个脚本,发现在命令行启动MySQL还可以直接执行这个 /usr/local/mysql/support-files/mysql.server 脚本即可。
另外一个问题,mac os 下mysql不需要my.cnf,用默认配置即可,如果想自己对mysql进行定制,拷贝「/usr/local/mysql/support-files/」目录下的符合自己用途一个 .cnf 文件到「/etc/」目录下并重命名为 my.cnf,然后修改 my.cnf 即可进行定制了。
配置好my.cnf后,对数据库进行重新初始化,首先确保停止mysql服务,把数据文件夹(默认为/usr/local/mysql/data)下清空,进入/usr/local/mysql目录,执行./scripts/mysql_install_db 即可。
初始化后启动数据库,在错误日志看到如下类似错误:
[ERROR] /usr/local/mysql/bin/mysqld: Can't find file: './mysql/host.frm' (errno: 13)
[ERROR] Fatal error: Can't open and lock privilege tables: Can't find file: './mysql/host.frm' (errno: 13)
造成上述错误的原因是数据文件夹的权限问题,必须把数据文件夹下的所有文件和文件夹的所有者该为_mysql(mac 是_mysql, linux下mysql的默认用户是mysql),命令:
chown -R _mysql:_mysql /usr/local/mysql/data
再次启动,又出现新的错误信息:
InnoDB: Error: unable to create temporary file; errno: 13
[ERROR] Plugin 'InnoDB' init function returned error.
[ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
[ERROR] Unknown/unsupported storage engine: InnoDB
这个问题的原因是自己定制的my.cnf中没有设置tmpdir信息,在mysqld段增加tmpdir = /var/tmp 即解决问题。
至此终于搞定Mac os 的mysql了。
今天看mac下mysql的启动脚本中有这么一行:
if [ "${MYSQLCOM:=-NO-}" = "-YES-" ] ; then
对其中的“:=”很是不解,开始使用“:=”作为关键字搜索,没有获得有用的信息,后来直接搜索冒号在shell中的用途,发现很多有人有这样的疑惑,我也搞明白上面表达式的意思。简单来说,就是当冒号前面的变量不存在或值为空时,就把等号后的值赋值给变量。举例来说:
#/bin/bash
#例1
var=1
echo $var
#输出 1
var=2
echo $var
#输出 2
#上述操作就是简单对变量赋值,后面的回覆盖前面的
#例2
unset var
#删除先前定义变量,防止对下面的操作产生影响
echo $var
#输出空
: ${var=1}
echo $var
#输出 1
: ${var=2}
echo $var
#输出 1
#上述操作也是对变量赋值,但与例1有些不同,赋值是放在${}中
#第一个输出很容易理解,第二个输出为什么还是 1 呢
#因为变量已经存在,所以不执行赋值操作
#注意:行首的冒号(:)是做什么呢,如果没有这个符号,那么在脚本中会把赋值后字符作为命令来执行,
#冒号是linux中一个内置的命令,相当于true,其实是啥也不做,空命令,
#冒号后的赋值作为命令的参数来解析,而不是执行
#例3
unset var
echo $var
: ${var:=1}
echo $var
: ${var:=2}
echo $var
#本例很例2差不多,得到的结果是一样,区别就是赋值一个用的是"=",
#另一个用的":=",看下面的例子就知道他们之间的区别了
unset var
echo $var
var=""
#赋值为空
: ${var=1}
echo $var
#输出空
unset var
echo $var
var=""
: ${var:=1}
echo $var
#输出1
#结论:使用"="时,当变量不存在(未申明)才对其复制,
#而":="是变量不存在或值为空时才对其赋值