魏长东

weichangdong

正在查看: php 分类下的文章(第 5 页 / 共 94 篇)

CI框架下hook的使用实例

最近在使用CI框架,看到框架/system/core/CodeIgniter.php代码好多地方出现类似这样的代码$EXT->_call_hook('pre_controller');但是又框架又看不到实际的代码,网上搜了下,原来这是所谓的钩子,我的理解是作者留下的口子,可以在这做些文章。

就拿这个代码$EXT->_call_hook('pre_controller');做例子吧。

首先需要在application/config/config.php开启这个支持,$config['enable_hooks'] = TRUE;设置成true就是开启。

然后在/application/config/hooks.php文件配置钩子到时候具体实施的对象。

»»阅读全文

thinkphp使用cli模式

看到thinkphp有个Mode文件夹,是不同的运行模式,因为工作中,经常使用命令行下执行php文件,比如为某个系统添加后台执行的crontab。如是就想试试搭建cli的模式。

这是Mode下的文件列表截图

tp-cli1.png

为了实现这个功能,我折腾其实花费了不少气力,但是最后发现其实改动很少,需要做的也很少,但是中间的确是一步一步的调试的。

»»阅读全文

php的invoke和invokeArgs函数

看一个框架,没有往常框架的先new一个类,然后执行method,原来是通过 ReflectionMethod的invoke和invokeArgs函数实现的。直接把手册的例子拿来了。

<?php
class HelloWorld {

    public function sayHelloTo($name) {
        return 'Hello ' . $name;
    }

}

$reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
echo $reflectionMethod->invokeArgs(new HelloWorld(), array('Mike'));
?>

执行输出:Hello Mike

»»阅读全文

Windows下使用Composer安装yii2

YII简介

Yii Framework是一个基于组件、用于开发大型 Web 应用的高性能 PHP 框架。Yii提供了今日Web 2.0应用开发所需要的几乎一切功能。Yii是最有效率的PHP框架之一。Yii是创始人薛强的心血结晶,于2008年1月1日开始开发。

Composer简介

Composer 是PHP中用来管理依赖(dependency)关系的工具。你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer会帮你安装这些依赖的库文件。

Windows安装Composer:

一、下载Composer

官网下载:https://getcomposer.org/download/

二、开启PHP的openssl支持

修改D:\WAMP\bin\php\php5.4.12配置文件php.ini

去掉注释;

三、安装Composer

一路"next"安装完毕。

安装完毕会提示你重新打开CMD命令行使用。

安装Yii2 - advanced 模板

一、下载yii2 - advanced 模板

官网下载:http://www.yiiframework.com/download/

下载完毕解压至
C:\xampp\htdocs\

二、通过composer安装

打开CMD,跳转到目录
C:\xampp\htdocs\yii2

我们来生成一个名为“yii2wcd”的app。

输入命令:

composer create-project --prefer-dist --stability=dev yiisoft/yii2-app-advanced ../yii2wcd

等待… …出现如下界面,表示安装成功。

»»阅读全文

php安装protobuff和运用

git clone https://github.com/allegro/php-protobuf/ ,把文件下载下来。

然后mv或者cp到/usr/local/php/include/php/ext/目录(安装php扩展的目录)下

cd进去,pwd

/usr/local/php/include/php/ext/php-protobuf

phpize 
./configure 
make && make install 

然后

php -m|grep pro

protobuf   //有这个扩展

然后开始实际应用 

»»阅读全文

延迟输出ob_start学习

有时候处理问题,比如对好多uid循环处理,然后逐个输出处理uid的结果,ok或者error。

除了直接输出以外,还可以延迟输出。

ob_start();
for ($i=0;$i<10;$i++) {
    echo "$i<br />";
}
$buffer = ob_get_contents();
ob_end_clean();
echo 'hello'.PHP_EOL.$buffer;//会输出for循环的内容
//echo 'hello'.PHP_EOL;这里不会输出for循环的数据

php长连接workerman学习

在linux虚拟机环境下安装了workerman,开始不知道从哪开始,最后自己搞了几个文件,折腾出了几个效果。

虽然暂时不知道内部代码是咋实现的,但是表面的应用层算是知道了点皮毛。

启动的效果(因为是监听不同的端口,所以虽然启动了两个,也不冲突,I think)。

workerman-0.jpg

显示http的形式:
建立了一个http.php文件。代码都是来自workerman的说明文件。

<?php
require_once './Workerman/Autoloader.php';
use Workerman\Worker;

// #### http worker ####
$http_worker = new Worker("http://127.0.0.1:10000");
$http_worker->count = 4;
$http_worker->onMessage = function($connection, $data)
{
    // send data to client
    $connection->send("hello world $data\n");
};

// run all workers
Worker::runAll();
我的理解是当127.0.0.1的10000端口有数据的话,就会给他返回hello world加上发送过来的数据(经自己
测试,还会返回http的头信息)。

»»阅读全文

php的socket学习笔记

用php的socket实现了:

客户端发送信息=》服务器收到信息=》客户端收到服务器的返回信息=》显示出来

代码是网上copy别人的,自己搭建环境执行了下。

server.php 服务端文件

<?php
error_reporting(E_ALL);
set_time_limit(0);
//ob_implicit_flush();
$address = '127.0.0.1';
$port = 10005;
//创建端口
if( ($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
	echo "socket_create() failed :reason:" . 
socket_strerror(socket_last_error()) . "\n";
}
//绑定
if (socket_bind($sock, $address, $port) === false) {
	echo "socket_bind() failed :reason:" . 
socket_strerror(socket_last_error($sock)) . "\n";
}
//监听
if (socket_listen($sock, 5) === false) {
	echo "socket_bind() failed :reason:" . 
socket_strerror(socket_last_error($sock)) . "\n";
}
do {
	//得到一个链接
	if (($msgsock = socket_accept($sock)) === false) {
		echo "socket_accepty() failed :reason:".
socket_strerror(socket_last_error($sock)) . "\n";
		break;
	}
	//welcome  发送到客户端
	$msg = "<font color='red'>server send:welcome</font><br/>";
	socket_write($msgsock, $msg, strlen($msg));
	echo 'read client message\n<br />';
	$buf = socket_read($msgsock, 8192);
	$talkback = "received message:$buf\n<br/>";
	echo $talkback;//在服务端命令行可以看到的此输出
	if (false === socket_write($msgsock, $talkback, strlen($talkback))) {
		echo "socket_write() failed reason:" . 
socket_strerror(socket_last_error($sock)) ."\n";
	} else {
		echo 'send success';//在服务端命令行可以看到的此输出
	}
	socket_close($msgsock);
} while(true);
//关闭socket
socket_close($sock);
?>

»»阅读全文

php几种遍历目录文件的方法

第一种用opendir,readdir,closedir系统函数遍历。应该是最常用的。

function myscandir($dir){
        $link = opendir($dir);
        $allfile =array();
        while(($value=readdir($link)) !== false){
                if ($value!='.' && $value!='..') {
                        if (is_dir($dir.'/'.$value)) {
                                $allfile[$dir]=myscandir($dir.'/'.$value);
                        }else {
                                $allfile[]=$dir.'/'.$value;
                        }
                }
        }
        closedir($link);
        return $allfile;
}
$v=myscandir('/home/test');
print_R($v);

第二种用scandir,这个需要对scandir出来的结果进行处理。

$v=scandir('/home/test');
function myscan($v)
{
        foreach ($v as $t){
                if($t=='.'||$t=='..')continue;
                if(is_dir($t)){
                        $tmp=scandir("/home/test/$t");
                        $file[$t]=myscan($tmp);
                }else{
                        $file[]=$t;
                }
        }
        return $file;
}
$v=myscan($v);
print_R($v);

第三种,用glob函数,这个和scandir差不多,也需要吧glob的结果拿来重新处理。

$wcd=glob("/home/test/*");
function myglob($wcd){
        foreach ($wcd as $v) {
                if(is_dir($v)){
                        $d=glob($v."/*");
                        $www[$v]=myglob($d);
                }else{
                        $www[]=$v;
                }
        }
        return $www;
}
$wcd=myglob($wcd);
print_R($wcd);

执行结果如下:

»»阅读全文

修复了CI框架STBLOG的一个BUG

前好一阵子,发现了我的这个博客的【日志分类】浏览有问题。每次点击之后,然后分页显示,但是点击第二页就,显示的内容就重复了,简单的说就是【http://swordman.sinaapp.com/index.php/category/php/4】的内容和【http://swordman.sinaapp.com/index.php/category/php/3】内容一样。开始以为是我加了SAE的kvdb缓存的问题,但是吧缓存给关掉了,问题依旧。困扰了我好久,今天龙颜大怒,铁腕杀之。

»»阅读全文