1、 【2015-04-29】system、exec、passthru这些执行外部程序的函数。
任何程序使用此函数启动,为了能保持在后台运行,此程序必须将输出重定向到文件或其它输出流。否则会导致 PHP 挂起,直至程序执行结束。
程序在后台执行:
exec('/usr/local/php/bin/php /home/web/public/index.php crontab exprot > /dev/null &');
虽然是推到了后台执行,但是没输出重定向,PHP 挂起,直至程序执行结束:
exec('/usr/local/php/bin/php /home/web/public/index.php crontab exprot &');
2、【2015-04-29】php和C接口交互, 避免明文加异或操作。
C++异或:
for(int i=0; i<tcpdata->len-8; i++)
{
*(data+i) = *(data+i)^(0xF4 * (i+8));
}
PHP异或:
//加异或操作,避免明文,从 command 后的数据都要异或
for($i=8; $i<$len; $i++){
$pack[$i] = chr(ord($pack[$i]) ^ (0xF4 * ($i)));
}
return $pack;
总结:不能直接把C代码翻译成PHP的,还要通过ord()和chr()这两个函数做转换。
附上完整的函数:
private function _headXor($cmd, $body)
{
$tmp[0] = pack("L", 8 + strlen($body));
$tmp[1] = pack("L", $cmd);
$tmp[2] = $body;
$pack = join("", $tmp);
$len = strlen($pack);
//加异或操作,避免明文,从 command 后的数据都要异或
for($i=8; $i<$len; $i++){
$pack[$i] = chr(ord($pack[$i]) ^ (0xF4 * ($i)));
}
return $pack;
}
3、【2015-04-30】验证E-mail地址
这是一个用于验证电子邮件的正则表达式。但它并不是高效、完美的解决方案。在此不推荐使用。
$email = "test@ansoncheung.tk";
if (preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/',$email)) {
echo "Your email is ok.";
} else {
echo "Wrong email address format";
}
为了更加有效验证电子邮件地址,推荐使用filer_var。
Php代码
if (filter_var('test+email@ansoncheung', FILTER_VALIDATE_EMAIL)) {
echo "Your email is ok.";
} else {
echo "Wrong email address format.";
}
4、【2015-04-30】用python把大的XLS表格转换为CSV文件。
php用PHPExcel读取50M左右的xls文件时经常超时或者报错,没找到解决办法。最后用python写了个脚本先把XLS的文件转换为小的CSV文件,php再读取csv文件轻松多了。
需要说明的是python读取50M左右的XLS文件只要10秒左右。
#!/usr/bin/python
#coding=utf-8
import os
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import xlrd
import csv
def csv_from_excel(file_name):
if not os.path.isfile(file_name):
sys.exit(0)
file_n,file_ext = os.path.splitext(file_name)
if file_ext != '.xls':
sys.exit(0)
wb = xlrd.open_workbook(file_name)
worksheets = wb.sheet_names()
i = 0
for worksheet_name in worksheets:
i += 1
worksheet = wb.sheet_by_name(worksheet_name)
file_csv = file_name+"_"+str(i)+".csv"
your_csv_file = open(file_csv, 'wb')
wr = csv.writer(your_csv_file, quoting=csv.QUOTE_ALL)
for rownum in xrange(worksheet.nrows):
wr.writerow([worksheet.cell_value(rownum,4)+"_end",worksheet.cell_value(rownum,6)])
#print worksheet.cell_value(rownum,4)
your_csv_file.close()
file_name = sys.argv[1]
csv_from_excel(file_name)