sublime安装格式化php代码插件(PHP_Beautifier)

没有评论

2013 年 04 月 22 日 at 下午 12:59分类:PHP | 其他技术

首先你的环境需要安装pear;
pear的下载:http://pear.php.net/go-pear.phar
下载好在命令行执行:php go-pear.phar;
安装perl成功后,要在d:\www\pear 目录下找到 PEAR_ENV.reg文件,执行导入即可。注意这个目录因人而已,选择不同的pear安装目录
那么这个文件所在地址也不一样。
perl安装成功,那么现在可以安装PHP_Beautifier,即然上面是通过perl安装的。那我在这也通过perl安装吧。

pear install PHP_Beautifier-0.1.15 

如果这里你有报什么错的话,那么就去问问百度和谷歌大神吧。哈哈~~
现在我们来安装sublime text的PhpBeautifier插件
通过sublime的package控制器直接安装 或者在这里 下载PhpBeautifier,解压到sublime text/data/package目录下
之后我们需要做些简单的修改:
1、打开你通过pear安装好的PHP_Beautifier的这个路径D:/www/pear/PHP/Beautifier/Filter 目录,

# 打开下面两个文件
 - Pear.filter.php  
 - phpBB.filter.php  
    
# 注释屌下面这句话
require_once ('PEAR/Config.php');  

然后修改sublime的插件文件:php_beautifier.py,找到滴26行代码

#修改这个地址为你的php_beautifier.bat所在文件目录
cmd = "D:\\www\\pear\\php_beautifier.bat"#"php_beautifier"

最好还要修改上面的那个bat文件:

//修改为你的bat文件所在的目录(应该是当前目录)
SET BEAUTIFY="D:\www\pear"\php_beautifier

OK。这样子就可以了
我们只要在php文件中使用ctrl+alt+f就可以格式化php的代码了
目前个人认为有个人缺点就是把默认的空行全部都去掉了。还有就是那个过滤的规则暂时还
不知道怎么写,还需要慢慢研究。。。

svn通过钩子获取提交的文件列表

没有评论

2013 年 04 月 18 日 at 下午 10:15分类:Linux

由于之前做过通过svn的钩子去自动部署项目,这个主要是通过svn up命令来操作 把这个操作命令写在post-commit钩子文件中来达到目的;
但是这样子的过程太过于自动,不能认为的参与,即我提交到了svn版本库那么就自动同步到了web服务器,我现在有个需求就是要捕获所有开发
人员的提交的修改文件的列表 ,然后交由其他控制终端来实现是否要同步到web服务器,这种情况更加适合于同步到测试服务器的情况。由于之间写过
svn的必须写提交信息才能提交成功的钩子,那么这回马上想到了用svnlook命令来处理,但是用什么子命令呢?把svnlook的所有(也不多啦)子命令
看了一遍,觉得可以使用svnlook youngest 和svnlook changed两个命令结合来使用
其实可以不用svnlook youngest的 因为svnlook changed默认的就是当前最新的版本;
直接上代码:


REPOS="$1"
TXN="$2"

SVNLOOK=/usr/bin/svnlook

NEW_VER=`$SVNLOOK youngest $REPOS`

$SVNLOOK changed  -r $NEW_VER $REPOS > /home/list.txt

利用libevent来实现异步操作

没有评论

2013 年 04 月 16 日 at 下午 1:26分类:PHP

libevent是php的一个网络异步方面的拓展,利用他我们可以实现一些网络异步访问方面的工作。比如抓去远程网页的内容等,若是在从前,一个比较靠谱的办法是利用curl_multi_exec或者其他函数来串行的请求好几个接口,但是这个办法需要用一个do … while循环来完成请求,很是坑爹,必须等待上一次执行完了才会执行下一次的操作,那么要是用libevent呢,可不是酱紫的哦。下面直接晒代码:

<?php
function httpGet($host, $base) {

    global $index;
	
	//使用fsockopen会导致阻塞
    //$fd = fsockopen($host, 80, $errno, $errstr, 3);
    $fd = stream_socket_client("{$host}:80", $errno, $errstr, 3, STREAM_CLIENT_ASYNC_CONNECT | STREAM_CLIENT_CONNECT); 
    $index[$fd] = 0;
	$event = event_new();
	//设置一个事件
	//回调函数有两个默认参数,第三个为传递值
    event_set($event, $fd, EV_WRITE | EV_PERSIST, function($fd, $events, $arg) use($host) {

		global $times, $limit, $index;
		
		if (!$index[$fd]) {
            $index[$fd] = 1;
            $out = "GET / HTTP/1.1\r\n";
            $out .= "Host: $host\r\n";
            $out .= "Connection: Close\r\n\r\n";
            fwrite($fd, $out);
        } else {
			//这里没有显示全部内容,这里获取的内容按照自己的需要去处理
            echo substr(fread($fd, 4096), 0, 20);
            if(feof($fd)) {
                fclose($fd);
                $times++;
                echo "done\n";
				//如果执行到最后一个事件了那么执行完毕退出
                if($times == $limit) {
                    event_base_loopexit($arg[1]);
                }
            }
		}
    }, array($event, $base));
    event_base_set($event, $base);
	//添加事件
    event_add($event);
}

$times = 0;
$limit = 2;
$index = array();

$base = event_base_new();

$urls = array('http://www.baidu.com', 'http://www.fbbin.com');

for($i = 0; $i < $limit; $i++) {
    echo "$i\n";
    httpGet($urls[$i], $base);
}

event_base_loop($base);

?>

代码中的 httpGet($urls[$i], $base);这行虽然是靠一个命令行顺序执行,但是不会阻塞后面的代码,直接就进行下一次请求了。在你运行的结果中你应该是先看到输出$i的值完了之后才会输出获取到的网页内容的。

Gearman的安装和使用

没有评论

2013 年 04 月 15 日 at 下午 1:17分类:Nginx | PHP | 其他技术

Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来在调用其它语言的函数的系统。
通常,多语言多系统之间的集成是个大问题,一般来说,人们多半会采用 WebService 的方式来处理此类集成问题,但不管采用何种风格的 WebService,如 RPC 风格,或者 REST 风格,其本身都有一定的复杂性。相比之下,Gearman 也能实现类似的作用,而且更简单易用。
一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。
Client:请求的发起者,可以是 C,PHP,Perl,MySQL UDF 等等。
Job:请求的调度者,用来负责协调把 Client 发出的请求转发给合适的 Work。
Worker:请求的处理者,可以是 C,PHP,Perl 等等。
因为 Client,Worker 并不限制用一样的语言,所以有利于多语言多系统之间的集成。
甚至我们通过增加更多的 Worker,可以很方便的实现应用程序的分布式负载均衡架构。
详细的一些信息就去问谷歌大神吧。
Gearman的安装,可能有些麻烦 我一开始用 的CentOS5.4的机器 结果是各种问题啊,后来实在不行了 ,换了6.2的机器来安装。

# wget https://launchpad.net/gearmand/1.2/1.1.5/+download/gearmand-1.1.5.tar.gz
# tar xzvf gearmand-1.1.5.tar.gz
# cd gearmand-1.1.5
# ./configure --prefix=/usr/local/gearmand
#  make
#  make install

这里如果出现了相关configure的错误(Boost ,uuid,mysql)的话,那么到网上找资料解决就好了,基本上都能解决,没什么难度的。
这样子的话,那么gearmand的服务端就完成了,我们称之为Job Server。
那么我们现在启动它:

# usr/local/gearmand/sbin/gearmand -d -P /var/run/gearmand.pid -l /var/log/gearmand.log -u root

接下来我们来安装gearmand的php拓展,我们在http://pecl.php.net中找下是可以找到的,如果找不到那么去这里点击也可以下载到相应的拓展。

# wget http://pecl.php.net/get/gearman-1.1.1.tgz
# tar zxvf gearman-1.1.1.tgz
# cd gearman
# phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config --with-gearman=/usr/local/gearmand
# make 
# make install

这里一定要加上–with-gearman参数,不然你又要为这个拓展单独去安装哥libgearmand了,没这个必要,网上有些文章就是这个错误引起的很多问题。
成功之后加入到php的配置文件中。
下面是我写的一个例子:

#worker.php
<?php
$worker=new GearmanWorker();
$worker->addServer("127.0.0.1", 4730);  //连接到Job server(gearmand) 上
$worker->addFunction("test", "testFunction"); 
while ($worker->work());
function testFunction($job) {
	$result = $job->workload();
	sleep(5);
	$data = unserialize($result);
	file_put_contents('./s.txt', var_export($data, true));
}
# client.php
<?php

$client=new GearmanClient();

$client->addServer("127.0.0.1", 4730); //连接到Job server(gearmand)上

$data = array('file'=>__FILE__, 'line'=>__LINE__);

$handler = $client->doBackground("test", serialize($data));//让任务在后台执行也就是异步

var_dump($handler);

$done = false;

echo "Running: .";

do {
   sleep(1);
   $stat = $client->jobStatus($handler);
   if (!$stat[0]) {
      $done = true;
   }
   echo " .";
} while(!$done);

echo "\n";

这个例子呢就是将客户端要执行的抛给gearmand的job server,让他去调度一个空闲的worker来执行我当前的这个任务。我们的woker可以有很多个,jobserver也可以有很多个,这样子就起到了负载均衡的作用了。这个东西在某些情况下应该比队列的效应来的更好些。
在实际使用时应该是运行gearmand -d 的 server 一台或者多台. [要装gearmand,运行gearmand];处理worker的机器若干[要装gearmand 及php so.但gearmand不需要运行].下达任务client若干[要装gearmand 及php so.但gearmand不需要运行]. worker 与 client 不会直接通信,都是通过gearmand来调度分发处理的.

参考:
1、http://www.it300.com/article-15263.html
2、http://blog.s135.com/dips
3、http://gearman.org/download

PHP中获取文件扩展名的几种方法比较

没有评论

2013 年 04 月 12 日 at 下午 1:19分类:PHP

第1种方法:

function get_extension($file) { 
    substr(strrchr($file, '.'), 1); 
} 

第2种方法:

 
function get_extension($file) { 
    return substr($file, strrpos($file, '.')+1); 
} 

第3种方法:

function get_extension($file) { 
    return end(explode('.', $file)); 
} 

第4种方法:

function get_extension($file) { 
   $info = pathinfo($file); 
   return $info['extension']; 
} 

第5种方法:

function get_extension($file) { 
   return pathinfo($file, PATHINFO_EXTENSION); 
} 

以上集中方法好像都行,特别是1、2种方法,在我不知道pathinfo有第二个参数之前也一直在用。
但是仔细考虑一下,前四种方法都有各种各样的毛病。要想完全正确获取文件的扩展名,必须要能处理以下三种特殊情况。
1、没有文件扩展名
2、路径中包含了字符.,如/home/test.d/test.txt
3、路径中包含了字符.,但文件没有扩展名。如/home/test.d/test

很明显:1、2不能处理第三种情况,3不能正确处理第一三种情况。4可以正确处理,但是在不存在扩展名时,会发出一个警告。
只有第5种方法才是最正确的方法。顺便看一下pathinfo方法。官网上介绍如下:

$file_path = pathinfo('/www/htdocs/your_image.jpg'); 
echo "$file_path ['dirname']\n"; 
echo "$file_path ['basename']\n"; 
echo "$file_path ['extension']\n"; 
echo "$file_path ['filename']\n"; // only in PHP 5.2+ 

它会返回一个数组,包含最多四个元素,但是并不会一直有四个,比如在没有扩展名的情况下,就不会有extension索引存在,所以第4种方法才会发现警告。但是phpinfo还支持第二个参数。可以传递一个常量,指定返回某一部分的数据:

PATHINFO_DIRNAME – 目录
PATHINFO_BASENAME – 文件名(含扩展名)
PATHINFO_EXTENSION – 扩展名
PATHINFO_FILENAME – 文件名(不含扩展名,PHP>5.2)

这四个常量的值分别是1、2、4、8,刚开始我还以为可以通过或运算指定多个:
pathinfo($file, PATHINFO_EXTENSION | PATHINFO_FILENAME);
后来发现这样不行,这只会返回几个进行或运算常量中最小的那个。也就是四个标志位中最小位为1的常量。

PHP用CURL伪造IP和来源

没有评论

2013 年 04 月 10 日 at 下午 10:19分类:PHP

今天群里一个朋友在问这个问题。
查了下,CURL确实很强悍的可以伪造IP和来源。
1.php 请求 index.php 。
1.php代码:

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://localhost/index.php");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:8.8.8.8', 'CLIENT-IP:8.8.8.8'));  //构造IP
curl_setopt($ch, CURLOPT_REFERER, "http://www.sina.com.cn/ ");   //构造来路
curl_setopt($ch, CURLOPT_HEADER, 1);
$out = curl_exec($ch);
curl_close($ch);

2.php代码如下:

<?php
function getClientIp() {
    if (!empty($_SERVER["HTTP_CLIENT_IP"]))
        $ip = $_SERVER["HTTP_CLIENT_IP"];
    else if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
        $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    else if (!empty($_SERVER["REMOTE_ADDR"]))
        $ip = $_SERVER["REMOTE_ADDR"];
    else
        $ip = "err";
    return $ip;
}

echo "IP: " . getClientIp() . "";
echo "referer: " . $_SERVER["HTTP_REFERER"];

echo "IP: " . getClientIp() . "";
echo "referer: " . $_SERVER["HTTP_REFERER"];

伪造成功,这是不是给“刷票”的朋友提供了很好的换IP的方案!!
哈哈。

结果:
HTTP/1.1 200 OK Date: Wed, 03 Apr 2013 06:20:42 GMT Server: Apache/2.2.22 (Win32) PHP/5.3.13 X-Powered-By: PHP/5.3.13 Content-Length: 44 Content-Type: text/html
IP: 8.8.8.8
referer: http://www.sina.com.cn/