swoole应用

实现了数据发送json格式后存储到数据库,同时存储到cache文件里。


<?php
/*
$cache_set = array(
//缓存路径 , 最后要加"/"
'cacheRoot'=>'./cache/',
//缓存时间
'cacheTime'=>20,
//cache type
'cacheType'=>1,
//扩展名
'cacheExe'=>'.php'
);
$cache = new Cache($cache_set);
$a=array('1','2');
$a="aaa";
$b='';
if($cache->cache_is("d")){
$c=$cache->cache_read("d");
echo "c";
print_r($c);
}else {
$b=$cache->cache_data('d',$a);
}
print_r($b);
//$cache->clear("a");
//echo $cache->cache_read("./cache/d.php");
//echo $d;
*/


/**
* 数据缓存类 v1.0
* @author shooke
* 2009-11-13 16:02:26
* 用于缓存数据,如变量,但不能缓存页面
*/
class Cache{
//配置
public $config = array(
//缓存路径
'cacheRoot'=>'./cache/',
//缓存时间
'cacheTime'=>1,
//cache 类型 1串化数据 2变量
'cacheType'=>2,
//扩展名
'cacheExe'=>'.php'
//转换中间变量
);

public $return_name=array();

function __construct($cache_set = array())
{
if(!empty($cache_set)) $this->config=array_merge($this->config,$cache_set);
$this->config['ClassName'] = __CLASS__;
}

public function clear($filename=''){
if (file_exists($this->cache_file($filename))) {
@unlink($this->cache_file($filename));
}elseif (empty($filename)){
$this->clear_dir($this->config['cacheRoot']);
}else{
$this->clear_dir($this->config['cacheRoot'].$filename);
echo $this->config['cacheRoot'].$filename;
}
}
//循环删除路径
private function clear_dir($dir,$to = false)
{
if ($list = glob($dir.'/*'))
{
foreach ($list as $file)
{
is_dir($file) ? $this->clear_dir($file) : unlink($file);
}
}

if ($to === false) rmdir($dir);
}

//写入缓存
private function cache_write($filename, $writetext, $openmod='w'){
if (!file_exists($filename)) {
@$this->makeDir( dirname($filename ));
}
if(@$fp = fopen($filename, $openmod)) {
flock($fp, 2);
fwrite($fp, $writetext);
fclose($fp);
return true;
} else {
echo "File: $filename write error.";
return false;
}
}

//缓存有效期 有效返回 true
public function cache_is($fileName){
$fileName=$this->cache_file($fileName);
if( file_exists( $fileName ) ) {
//如果缓存时间为负数则永不过期
if ($this->config['cacheTime'] < 0) {
return true;
}
//如果缓存时间为0则一直过期
if ($this->config['cacheTime'] == 0) {
return false;
}
//获取缓存文件的建立时间
$ctime = intval(filemtime( $fileName ));
//比较是否大于缓存时间,是则过期 否则不过期
if (time() - $ctime > $this->config['cacheTime']) {
return false;
}else {
return true;
}
//文件不存在视为过期失效
}else {
return false;
}
}

public function cache_data($name,$data){
$varname=$name;
$name = $this->cache_file($name);
//config['cacheTime']==0也就是不启用缓存是直接返回数据
if ($this->config['cacheTime'] <> 0) {
if($this->config['cacheType']==1){
$write_data = "<?php exit;?>".serialize($data);
//return $data;
}else {
$write_data = "<?php\r\n\$var= ";
$write_data .= var_export($data,true);
$write_data .=";\r\n?>";
}
$this->cache_write($name,$write_data);
}
return $data;

}
//缓存文件名
private function cache_file($filename){
return $this->config['cacheRoot'].$filename.$this->config['cacheExe'];
}

//读取文件
public function cache_read($file){
$file=$this->cache_file($file);
if (!file_exists($file)) {
return '';
}
if($this->config['cacheType']==1){
if (function_exists('file_get_contents')){
$cache_Content= file_get_contents($file);
}else{
$fopen = fopen($file,'r');
$cache_Content = '';
do {
$data = fread($fopen,filesize($file));
if (strlen($data)===0) break;
$cache_Content .= $data;
}while(1);
fclose($fopen);
}
$cache_Content = substr($cache_Content,13);/* 去除<?php exit;?> */
$cache_Content = unserialize($cache_Content);
return $cache_Content;
}else{
include_once($file);
return $var;
}

}

//循环创建目录
private function makeDir( $dir, $mode = 0777 ) {
if( ! $dir ) return 0;
$dir = str_replace( "\\", "/", $dir );
$mdir = "";
foreach( explode( "/", $dir ) as $val ) {
$mdir .= $val."/";
if( $val == ".." || $val == "." || trim( $val ) == "" ) continue;

if( ! file_exists( $mdir ) ) {
if(!@mkdir( $mdir, $mode )){
return false;
}
}
}
return true;
}

}

?>

<?php
require('Cache.php');
$cache_set = array(
//缓存路径 , 最后要加"/"
'cacheRoot'=>'./cache/',
//缓存时间
'cacheTime'=>20,
//cache type
'cacheType'=>1,
//扩展名
'cacheExe'=>'.php'
);
function is_json($string) {
json_decode($string);
return (json_last_error() == JSON_ERROR_NONE);
}
$serv = new swoole_server("0.0.0.0", 9501, SWOOLE_BASE, SWOOLE_SOCK_UDP);
$serv->set(array(
'dispatch_mode' => 1,
'worker_num' => 4,
));
$serv->on('Start', function ($serv){
echo "MasterPid={$serv->master_pid}|Manager_pid={$serv->manager_pid}\n";
echo "Server: start.Swoole version is [".SWOOLE_VERSION."]\n";
});
$serv->on('receive', function ($serv, $fd, $from_id, $data) {
if (is_json($data)){
$array=json_decode($data);
if (array_key_exists("add",$array)){
$a=$array->add;
$cache_set = array(
//缓存路径 , 最后要加"/"
'cacheRoot'=>'./cache/',
//缓存时间
'cacheTime'=>20,
//cache type
'cacheType'=>1,
//扩展名
'cacheExe'=>'.php'
);
$cache = new Cache($cache_set);
$cache->cache_data('add'.$a,$fd);
foreach($array as $key=>$value)
{
if ($key<>"add"){
$db_host = '127.0.0.1'; //数据库主机名称,一般都为localhost
$db_user = 'hsg'; //数据库用户帐号,根据个人情况而定
$db_passw = 'hongshigou'; //数据库用户密码,根据个人情况而定
$db_name = 'hsg'; //数据库具体名称
//连接数据库
$conn = MySQL_connect($db_host,$db_user,$db_passw) or die ('数据库连接失败!');
//设置字符集,如utf8和gbk等,根据数据库的字符集而定
//MySQL_query("set names 'utf8'");
MySQL_query("set names 'gb2312'");
//选定数据库
MySQL_select_db($db_name,$conn) or die('数据库选定失败!');
//执行SQL语句(查询)
$sql = "INSERT INTO `hsg`.`data` (`point` , `val`)VALUES ('$key$a', '$value');";
$result = MySQL_query($sql) or die('数据库查询失败!<br/>可能数据库中没有记录'); //SQL语句在这里执行
if(!$result){
echo $fd." ";
}
$cache->cache_data($key.$a,$value);
mysql_close($conn);
}
}
$serv->send($fd, "OK");
}
}
});
$serv->start();
?>

此条目发表在网络知识分类目录。将固定链接加入收藏夹。