关注HipHop移植到FreeBSD
从一个博客上看到,已经在着手移植了。
php-excel是一个PHP导出excel文件的类库。导出的是XML文件,用office2003,openoffice3都可以正常打开。
官方网站:
简单的例子:
<?php
// load library
require ‘php-excel.class.php’;// create a simple 2-dimensional array
$data = array(
1 => array (‘Name’, ‘呵呵’),
array(‘Schwarz’, ‘Oliver’),
array(‘Test’, ‘Peter’)
);// generate file (constructor parameters are optional)
$xls = new Excel_XML(‘GB2312′, true, ‘My Test Sheet’);
$xls->addArray($data);
$xls->generateXML(‘my-test’);?>
使用PHP来生成条码,找到了一个开源的程序php-barcode。
网站首页: http://www.ashberg.de/php-barcode/index.php
下载地址: http://www.ashberg.de/php-barcode/download/
需要安装barcode 和genbarcode。我是在FreeBSD下安装的。barcode就直接在ports里安装了。
安装barcode:
# cd /usr/ports/graphics/barcode
# make install clean
安装genbarcode:
# tar -zxf genbarcode-0.4.tar.gz
# cd genbarcode-0.4
# gmake
# gmake install
安装php-barcode:
在WEB目录下:
# tar -zxf php-barcode-0.3pl1.tar.gz
# mv php-barcode-0.3pl1 phpbarcode
# chmod -R 755 phpbarcode
访问:
* http://localhost/barcode.php?code=012345678901
* http://localhost/barcode.php?code=012345678901&encoding=EAN&scale=4&mode=png
php-fpm的freebsd ports只到5.2.11就没有更新了。但是其他php的扩展都升级到了5.2.12。调试程序的时候出现异常情况。就自己动手修改了php-fpm的ports配置文件。
Makefile 补丁:
— ../php5-fpm/Makefile 2009-10-13 05:53:43.000000000 +0800
+++ Makefile 2010-04-02 21:08:21.000000000 +0800
@@ -7,7 +7,7 @@PORTNAME= php5-fpm
PORTVERSION= ${PHP_VERSION}
-PHP_VERSION= 5.2.11
+PHP_VERSION= 5.2.12
PHPFPM_VERSION= 0.6.3
PORTREVISION?= 0
CATEGORIES?= lang devel www
distinfo补丁:
— ../php5-fpm/distinfo 2009-10-13 05:41:42.000000000 +0800
+++ distinfo 2010-04-02 21:13:46.000000000 +0800
@@ -1,12 +1,12 @@
-MD5 (php-5.2.11.tar.bz2) = 286bf34630f5643c25ebcedfec5e0a09
-SHA256 (php-5.2.11.tar.bz2) = 9bcd14ceda2b4bd7abcc7eb59bd74bae490d9335e4207580de783b48aa7e8f23
-SIZE (php-5.2.11.tar.bz2) = 9030787
+MD5 (php-5.2.12.tar.bz2) = 5b7077e366c7eeab34da31dd860a1923
+SHA256 (php-5.2.12.tar.bz2) = e65756a8412726a491ca48da1e0693eaeb3f38f19fb6cbc8f53005cab1f2491a
+SIZE (php-5.2.12.tar.bz2) = 9075161
MD5 (php-fpm-0.6.3.tar.bz2) = be0d67a73474f2273b8d90447d057fc2
SHA256 (php-fpm-0.6.3.tar.bz2) = 1233ce7b19c90e159474af13548541617ceead85887b201f752bc1bbbe3e4905
SIZE (php-fpm-0.6.3.tar.bz2) = 1909302
-MD5 (suhosin-patch-5.2.11-0.9.7.patch.gz) = 8f9de4d97fae6eba163cf3699509a260
-SHA256 (suhosin-patch-5.2.11-0.9.7.patch.gz) = 392f10c9b7d9c47f30e989fb7775cc46d36153b933bf7ac9ccd8826b2954584b
-SIZE (suhosin-patch-5.2.11-0.9.7.patch.gz) = 23050
+MD5 (suhosin-patch-5.2.12-0.9.7.patch.gz) = 40be1b05ad893a01778d7fb323dd8872
+SHA256 (suhosin-patch-5.2.12-0.9.7.patch.gz) = f324cf09cb83826fb35308c890ca06e14d64e5d65129f3ba8f3e61953e442366
+SIZE (suhosin-patch-5.2.11-0.9.7.patch.gz) = 23062
MD5 (php-5.2.10-mail-header.patch) = 7f73682e78d32e22989c3fb3678d668b
SHA256 (php-5.2.10-mail-header.patch) = a61d50540f4aae32390118453845c380fe935b6d1e46cef6819c8561946e942f
SIZE (php-5.2.10-mail-header.patch) = 3383
在编译安装的过程中,会报libevent错误:
../libevent/.libs/libevent.a: could not read symbols: File format not recognized
*** Error code 1Stop in /usr/ports/lang/php5-fpm/work/php-fpm-0.6.3/src.
*** Error code 1Stop in /usr/ports/lang/php5-fpm/work/php-fpm-0.6.3/src.
*** Error code 1Stop in /usr/ports/lang/php5-fpm/work/php-fpm-0.6.3/src.
*** Error code 1Stop in /usr/ports/lang/php5-fpm/work/php-fpm-0.6.3.
*** Error code 1
解决办法:
# cd work/php-fpm-0.6.3/libevent/
# make clean
# cd ../../../
# make install clean
466页,安装xdebug。原文“就像APD一样,你可以运行pear install xdebug 从PECL安装Xdebug。”
这里的pear有误,应当是pecl。
正确方法: pecl install xdebug。
新功能:
修复BUG:
升级:
其他:
下载地址:
http://fedns.isyi.com/download/index.shtml#2.1
使用手册:
在线阅读或者下载阅读:
新功能:
修复BUG:
升级:
其他:
原文地址:
http://bbs.chinaunix.net/viewthread.php?tid=661015&extra=page%3D1%26amp%3Bfilter%3Ddigest&page=1
[学习] PHP中的(伪)多线程与多进程
已经因为没怎么需要,所以没有查这个的资料。最近有一个项目却是需要这样子的功能。
查看了PHP的手册和他人的例子,了解到基本的两种方法:
(伪)多线程:借助外力
利用WEB服务器本身的多线程来处理,从WEB服务器多次调用我们需要实现多线程的程序。
以下转载自:http://www.laikan8.com/21/118472.html
也就是说可以同时让多人一起访问. 这也是我在PHP中实现多线程的基础.
假设我们现在运行的是a.php这个文件. 但是我在程序中又请求WEB服务器运行另一个b.php
那么这两个文件将是同时执行的.
(PS: 一个链接请求发送之后, WEB服务器就会执行它, 而不管客户端是否已经退出)
有些时候, 我们想运行的不是另一个文件, 而是本文件中的一部分代码.该怎么办呢?
其实可是通过参数来控制a.php来运行哪一段程序.
下面看一个例子:
//a.php
PHP代码:——————————————————————————–
CODE:
function a()
{
$fp = fopen(‘result_a.log’, ‘w’);
fputs($fp, ‘Set in ‘ . Date(‘h:i:s’, time()) . (double)microtime() . “rn”);
fclose($fp);
}
function b()
{
$fp = fopen(‘result_b.log’, ‘w’);
fputs($fp, ‘Set in ‘ . Date(‘h:i:s’, time()) . (double)microtime() . “rn”);
fclose($fp);
}
if(!isset($_GET['act'])) $_GET['act'] = ‘a’;
if($_GET['act'] == ‘a’)
{
runThread();
a();
}
else if($_GET['act'] == ‘b’) b();
?>
——————————————————————————–
打开result_a.log 和 result_b.log 比较一下两个文件的中访问的时间. 大家会发现, 这两个的确是在不同线程中运行的.
有些时间完全一样.
上面只是一个简单的例子, 大家可以改进成其它形式.
既然PHP中也能多线程了, 那么问题也来了, 那就是同步的问题. 我们知道 PHP本身是不支持多线程的. 所以更不会有什么像
Java 中synchronize的方法了. 那我们该如何做呢.
1. 尽量不访问同一个资源. 以避免冲突. 但是可以同时像数据库操作. 因为数据库是支持并发操作的. 所以在多线程的PHP中
不要向同一个文件中写入数据. 如果必须要写的话, 用别的方法进行同步.. 如调用 flock对文件进行加锁等. 或建立临时文件
并在另外的线程中等待这个文件的消失 while(file_exits(‘xxx’)); 这样就等于这个临时文件存在时, 表示其实线程正在操作
如果没有了这个文件, 说明其它线程已经释放了这个.
2. 尽量不要从runThread在执行fputs后取这个socket中读取数据. 因为要实现多线程, 需要的用非阻塞模式. 即在像fgets这
样的函数时立即返回.. 所以读写数据就会出问题. 如果使用阻塞模式的话, 程序就不算是多线程了. 他要等上面的返回才执行
下面的程序. 所以如果需要交换数据最后利用外面文件或数据中完成. 实在想要的话就用socket_set_nonblock($fp) 来实现.
说了这么多, 倒底这个有没有实际的意义呢? 在什么时候需要这种用这种方法呢 ?
答案是肯定的. 大家知道. 在一个不断读取网络资源的应用中, 网络的速度是瓶颈. 如果采多这种形式就可以同时以多个线程对
不同的页面进行读取.
本人做的一个能从8848、soaso这些商城网站搜索信息的程序。还有一个从阿里巴巴网站上读取商业信息和公司目录的程序也用到
了此技术。 因为这两个程序都是要不断的链接它们的服务器读取信息并保存到数据库。 利用此技术正好消除了在等待响应时的瓶
颈。
多进程:使用PHP的Process Control Functions(PCNTL/线程控制函数)
函数参考可见:http://www.php.net/manual/zh/ref.pcntl.php
只能用在Unix Like OS,Windows不可用。
编译php的时候,需要加上–enable-pcntl,且推荐仅仅在CLI模式运行,不要在WEB服务器环境运行。
以下为简短的测试代码:
CODE:
echo (“Startn”);
for($i = 0; $i < $intNum; $i++) {
$pids[$i] = pcntl_fork();/// 产生子进程,而且从当前行之下开试运行代码,而且不继承父进程的数据信息
if(!$pids[$i]) {
// 子进程进程代码段_Start
$str=”";
sleep(5+$i);
for ($j=0;$j<$i;$j++) {$str.=”*”;}
echo “$i -> ” . time() . ” $str n”;
exit();
// 子进程进程代码段_End
}
}
if ($bWaitFlag)
{
for($i = 0; $i < $intNum; $i++) {
pcntl_waitpid($pids[$i], $status, WUNTRACED);
echo “wait $i -> ” . time() . “n”;
}
}
echo (“Endn”);
?>
运行结果如下:
CODE:
[qiao@oicq qiao]$
如果$bWaitFlag=TURE,则结果如下:
CODE:
从 多进程的例子可以看出,使用pcntl_fork()之后,将生成一个子进程,而且子进程运行的代码,从pcntl_fork()之后的代码开始,而子进 程不继承父进程的数据信息(实际上是把父进程的数据做了一个全新的拷贝),因而使用if(!$pids[$i]) 来控制子进程实际运行的代码段。
更详细的研究出于时间关系,暂时没有进行,你可以参考我给出的手册的链接。
今天检查邮件服务时发现,部分监控报警邮件被误判为垃圾邮件,被拦截了下来。
google才知道,是标题编码的问题。
日志中发现这个提示:
X-Amavis-Alert: BAD HEADER Non-encoded 8-bit data
最新评论