首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
182 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
28
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
100
篇与
的结果
2023-08-08
php定时执行任务实现方法详解
php定时执行任务实现方法详解本文章来给大家总结了一些常用的关于在php定时执行任务实现方法详解,包括直接利用php来操作,还有使用操作系统的计划任务来操作,有需要了解的同学可参考。每个PHP脚本都限制了执行时间,所以我们需要通过 set_time_limit 来设置一个脚本的执行时间为无限长;然后使用 flush() 和 ob_flush() 来清除服务器缓冲区,随时输出脚本的返回值。 当我们执行后,每隔5秒钟,我们会得到一行 Hello World代码如下header("Content-Type: text/plain");set_time_limit(0);$infoString = "Hello World" . "n";while( isset($infoString) ){echo $infoString;flush();ob_flush();sleep(5);}例代码如下<?phpignore_user_abort(); // 即使Client断开(如关掉浏览器),PHP脚本也可以继续执行.set_time_limit(0); // 执行时间为无限制,php默认的执行时间是30秒,通过set_time_limit(0)可以让程序无限制的执行下去$interval=20; // 时间间隔 单位 秒$key_file="key.txt"; // 配置文件if (isset($_GET['s'])){if ($_GET['s']=="0"){ // 停止工作,但不退出$s="false";echo "Function is off";}elseif ($_GET['s']=="1"){ // 工作$s="true";echo "Function is on";}elseif ($_GET['s']=="2"){ // 退出$s="die";echo "Function exited";}elsedie("Err 0:stop working 1:working 2:exit");$string = "<?phpn return "".$s."";n?>";write_inc($key_file,$string,true);exit();}if(file_exists($key_file)){do{$mkey = include $key_file;if ($mkey=="true"){ // 如果工作///////////////////// 工作区间 //////////////////////////////////$showtime=date("Y-m-d H:i:s");$fp = fopen('func.txt','a');fwrite($fp,$showtime."n");fclose($fp);///////////////////////////////////////////////////////////////////}elseif ($mkey=="die"){ // 如果退出die("I am dying!");}sleep($interval); // 等待$interval分钟}while(true);}elsedie($key_file." doesn't exist !");function write_inc($path,$strings,$type=false){$path=dirname(__FILE__)."/".$path;if ($type==false)file_put_contents($path,$strings,FILE_APPEND);elsefile_put_contents($path,$strings);}?>个人觉得在php定时执行任务还是有点复杂并且不好使用,下面我来介绍在操作系统中计划任务来实现。在网上找了些WINDOWS执行PHP的计划任务的方法,有一个写得很全,可惜在我这竟然没通过。最后不得不综合各门派的方法,才能在我这运行成功。1、写一个PHP程序,命名为test.php,内容如下所示:代码如下<?$fp = fopen("test.txt", "a+");fwrite($fp, date("Y-m-d H:i:s") . " 成功成功了!n");fclose($fp);?>程序大胆地写,什么includerequire尽管用,都没问题2、新建Bat文件,命名为test.bat,内容如下所示:代码如下D:phpphp.exe -q D:websitetest.php//相应目录自己改上3、建立WINDOWS计划任务:开始–>控制面板–>任务计划–>添加任务计划浏览文件夹选择上面的bat文件设置时间和密码(登陆WINDOWS的)保存即可了。4、over! 可以右键计划任务点“运行”试试linux系统中我们可以借助Linux的Crontab工具来稳定可靠地触发PHP执行任务。下面介绍Crontab的两种方法。一、在Crontab中使用PHP执行脚本就像在Crontab中调用普通的shell脚本一样(具体Crontab用法),使用PHP程序来调用PHP脚本。每一小时执行myscript.php如下:1.代码如下crontab -e2.00 /usr/local/bin/php /home/john/myscript.php/usr/local/bin/php为PHP程序的路径。二、在Crontab中使用URL执行脚本如果你的PHP脚本可以通过URL触发,你可以使用lynx或curl或wget来配置你的Crontab。下面的例子是使用Lynx文本浏览器访问URL来每小时执行PHP脚本。Lynx文本浏览器默认使用对话方式打开URL。但是,像下面的,我们在lynx命令行中使用-dump选项来把URL的输出转换来标准输出。代码如下1.00 lynx -dump /myscript.php下面的例子是使用CURL访问URL来每5分执行PHP脚本。Curl默认在标准输出显示输出。使用"curl -o"选项,你也可以把脚本的输出转储到临时文件。代码如下1./5 * /usr/bin/curl -o temp.txt /myscript.php下面的例子是使用WGET访问URL来每10分执行PHP脚本。-q选项表示安静模式。"-O temp.txt"表示输出会发送到临时文件。代码如下1./10 * /usr/bin/wget -q -O temp.txt /myscript.php
2023年08月08日
22 阅读
0 评论
0 点赞
2023-08-08
Memcache基础教程
Memcache基础教程Memcache是什么Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。Memcache官方网站:http://www.danga.com/memcached,更多详细的信息可以来这里了解 🙂为什么会有Memcache和memcached两种名称?其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,知道我的意思了把~~~~。一个是项目名称,一个是主程序文件名,在网上看到了很多人不明白,于是混用了。Memcache的安装分为两个过程:memcache服务器端的安装和memcached客户端的安装。所谓服务器端的安装就是在服务器(一般都是linux系统)上安装Memcache实现数据的存储所谓客户端的安装就是指php(或者其他程序,Memcache还有其他不错的api接口提供)去使用服务器端的Memcache提供的函数,需要php添加扩展。具体的配置大家可以参考:Linux下的Memcache安装:http://www.ccvita.com/257.htmlWindows下的Memcache安装:http://www.ccvita.com/258.htmlMemcache基础教程:http://www.ccvita.com/259.htmlDiscuz!的Memcache缓存实现:http://www.ccvita.com/261.htmlMemcache协议中文版:http://www.ccvita.com/306.htmlMemcache分布式部署方案:http://www.ccvita.com/395.htmlPHP的Memcache< ?php//连接$mem = new Memcache;$mem->connect("192.168.0.200", 12000);//保存数据$mem->set('key1', 'This is first value', 0, 60);$val = $mem->get('key1');echo "Get key1 value: " . $val ."";//替换数据$mem->replace('key1', 'This is replace value', 0, 60);$val = $mem->get('key1');echo "Get key1 value: " . $val . "";//保存数组$arr = array('aaa', 'bbb', 'ccc', 'ddd');$mem->set('key2', $arr, 0, 60);$val2 = $mem->get('key2');echo "Get key2 value: ";print_r($val2);echo "";//删除数据$mem->delete('key1');$val = $mem->get('key1');echo "Get key1 value: " . $val . "";//清除所有数据$mem->flush();$val2 = $mem->get('key2');echo "Get key2 value: ";print_r($val2);echo "";//关闭连接$mem->close();?>如果正常的话,浏览器将输出:Get key1 value: This is first valueGet key1 value: This is replace valueGet key2 value: Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd )Get key1 value:Get key2 value:程序代码分析初始化一个Memcache的对象:$mem = new Memcache;连接到我们的Memcache服务器端,第一个参数是服务器的IP地址,也可以是主机名,第二个参数是Memcache的开放的端口:$mem->connect("192.168.0.200", 12000);保存一个数据到Memcache服务器上,第一个参数是数据的key,用来定位一个数据,第二个参数是需要保存的数据内容,这里是一个字符串,第三个参数是一个标记,一般设置为0或者MEMCACHE_COMPRESSED就行了,第四个参数是数据的有效期,就是说数据在这个时间内是有效的,如果过去这个时间,那么会被Memcache服务器端清除掉这个数据,单位是秒,如果设置为0,则是永远有效,我们这里设置了60,就是一分钟有效时间:$mem->set('key1', 'This is first value', 0, 60);从Memcache服务器端获取一条数据,它只有一个参数,就是需要获取数据的key,我们这里是上一步设置的key1,现在获取这个数据后输出输出:$val = $mem->get('key1');echo "Get key1 value: " . $val;现在是使用replace方法来替换掉上面key1的值,replace方法的参数跟set是一样的,不过第一个参数key1是必须是要替换数据内容的key,最后输出了:$mem->replace('key1', 'This is replace value', 0, 60);$val = $mem->get('key1');echo "Get key1 value: " . $val;同样的,Memcache也是可以保存数组的,下面是在Memcache上面保存了一个数组,然后获取回来并输出$arr = array('aaa', 'bbb', 'ccc', 'ddd');$mem->set('key2', $arr, 0, 60);$val2 = $mem->get('key2');print_r($val2);现在删除一个数据,使用delte接口,参数就是一个key,然后就能够把Memcache服务器这个key的数据删除,最后输出的时候没有结果$mem->delete('key1');$val = $mem->get('key1');echo "Get key1 value: " . $val . "";最后我们把所有的保存在Memcache服务器上的数据都清除,会发现数据都没有了,最后输出key2的数据为空,最后关闭连接$mem->flush();$val2 = $mem->get('key2');echo "Get key2 value: ";print_r($val2);echo "";代码使用<?php//1.实例化一个Memcache对象$mem=new Memcache;//2. 连接到指定的memcache中$mem->connect("127.0.0.1",11211);//0表示不压缩数据,如果使用压缩MEMCACHE_COMPRESSEDif(!$mem->add("name","test1",0,30)){echo "name 已经存在了";}else{echo "ok!";}//可以放入数值if(!$mem->add("age",100,0,30)){echo "age 已经存在了";}else{echo "ok!";}//可以放入booleanif(!$mem->set("ok",true,0,30)){echo "ok 保存成功";}else{echo "ok!";}//放入数组$arr1=array("aa"=>"北京","bb"=>"天津");//对数组进行序列化,在网络传输的时候,为了保证,数据类型的不丢失,//先序列化,再发生.//$arr1=serialize($arr1);$arr2=json_encode($arr1);print_r($arr2);$mem->add("arr",$arr1,MEMCACHE_COMPRESSED,100);//对象require "Person.class.php";$person=new Person(10,"xiaoming");$mem->add("per1",$person,MEMCACHE_COMPRESSED,100);//取出$per2=$mem->get("per1");var_dump($per2);echo "对象名字=".$per2->name;//string, int,float, boolean array object null resource//不能把resource 类型放入到memcache$con=mysql_connect("localhost","root","root");echo "<br/>";var_dump($con);$mem->add("mylink",$con);?>关于如何使用多个memcached 缓存服务器.<?php$mem=new Memcache();//如果我们网站,需要多个memached缓存系统.//$mem->connect("localhost",11211); (立即向localhost的11211端口发出连接)$mem->addServer("192.168.1.100",11211);//256 ->10m$mem->addServer("192.168.1.200",11211);$mem->addServer("192.168.1.222",11211);//创建多个memcache服务使用.//addServer 会根据负载均衡算法,自动放入每个服务器$mem->add("name","zs",0,100);?>注意:string, int,float, boolean array object null resource 中除了 resource 不能存放,其它都可以.Memcache的使用使用Memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让Memcache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅速的进行存取。那么一般的焦点就是集中在如何分担数据库压力和进行分布式,毕竟单台Memcache的内存容量的有限的。我这里简单提出我的个人看法,未经实践,权当参考。分布式应用Memcache本来支持分布式,我们客户端稍加改造,更好的支持。我们的key可以适当进行有规律的封装,比如以user为主的网站来说,每个用户都有User ID,那么可以按照固定的ID来进行提取和存取,比如1开头的用户保存在第一台Memcache服务器上,以2开头的用户的数据保存在第二胎Mecache服务器上,存取数据都先按照User ID来进行相应的转换和存取。但是这个有缺点,就是需要对User ID进行判断,如果业务不一致,或者其他类型的应用,可能不是那么合适,那么可以根据自己的实际业务来进行考虑,或者去想更合适的方法。减少数据库压力这个算是比较重要的,所有的数据基本上都是保存在数据库当中的,每次频繁的存取数据库,导致数据库性能极具下降,无法同时服务更多的用户,比如MySQL,特别频繁的锁表,那么让Memcache来分担数据库的压力吧。我们需要一种改动比较小,并且能够不会大规模改变前端的方式来进行改变目前的架构。我考虑的一种简单方法:后端的数据库操作模块,把所有的Select操作提取出来(update/delete/insert不管),然后把对应的SQL进行相应的hash算法计算得出一个hash数据key(比如MD5或者SHA),然后把这个key去Memcache中查找数据,如果这个数据不存在,说明还没写入到缓存中,那么从数据库把数据提取出来,一个是数组类格式,然后把数据在set到Memcache中,key就是这个SQL的hash值,然后相应的设置一个失效时间,比如一个小时,那么一个小时中的数据都是从缓存中提取的,有效减少数据库的压力。缺点是数据不实时,当数据做了修改以后,无法实时到前端显示,并且还有可能对内存占用比较大,毕竟每次select出来的数据数量可能比较巨大,这个是需要考虑的因素。Memcache的安全我们上面的Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄露被其他无关人员查看,重则服务器被入侵,因为Mecache是以root权限运行的,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,所以危险性是可以预见的。为了安全起见,我做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。内网访问最好把两台服务器之间的访问是内网形态的,一般是Web服务器跟Memcache服务器之间。普遍的服务器都是有两块网卡,一块指向互联网,一块指向内网,那么就让Web服务器通过内网的网卡来访问Memcache服务器,我们Memcache的服务器上启动的时候就监听内网的IP地址和端口,内网间的访问能够有效阻止其他非法的访问。memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pidMemcache服务器端设置监听通过内网的192.168.0.200的ip的11211端口,占用1024MB内存,并且允许最大1024个并发连接设置防火墙防火墙是简单有效的方式,如果却是两台服务器都是挂在网的,并且需要通过外网IP来访问Memcache的话,那么可以考虑使用防火墙或者代理程序来过滤非法访问。一般我们在Linux下可以使用iptables或者FreeBSD下的ipfw来指定一些规则防止一些非法的访问,比如我们可以设置只允许我们的Web服务器来访问我们Memcache服务器,同时阻止其他的访问。iptables -Fiptables -P INPUT DROPiptables -A INPUT -p tcp -s 192.168.0.2 --dport 11211 -j ACCEPTiptables -A INPUT -p udp -s 192.168.0.2 --dport 11211 -j ACCEPT上面的iptables规则就是只允许192.168.0.2这台Web服务器对Memcache服务器的访问,能够有效的阻止一些非法访问,相应的也可以增加一些其他的规则来加强安全性,这个可以根据自己的需要来做。Memcache的使用和协议分析详解
2023年08月08日
11 阅读
0 评论
0 点赞
2023-08-08
PHP中的Memcache详解
PHP中的Memcache详解这篇文章主要介绍了PHP中的Memcache,从Memcache简介开始,详细讲解了如Memcache和memcached的区别、PHP的Memcache所有操作方法、每个操作方法的详细解释等,需要的朋友可以参考下一、Memcache简介Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached管理这些HashTable,所以速度非常快。 二、Memcache和memcached的区别为什么会有Memcache和memcached两种名称?其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,知道我的意思了把~~~~。一个是项目名称,一个是主程序文件名,在网上看到了很多人不明白,于是混用了。三、Memcache的服务器端和客户端安装分为两个过程:memcache服务器端的安装和memcached客户端的安装。所谓服务器端的安装就是在服务器(一般都是linux系统)上安装Memcache实现数据的存储。所谓客户端的安装就是指php(或者其他程序,Memcache还有其他不错的api接口提供)去使用服务器端的Memcache提供的函数,需要php添加扩展。四、PHP的Memcache客户端所有方法总结memcache函数所有的方法列表如下:Memcache::add – 添加一个值,如果已经存在,则返回falseMemcache::addServer – 添加一个可供使用的服务器地址Memcache::close – 关闭一个Memcache对象Memcache::connect – 创建一个Memcache对象memcache_debug – 控制调试功能Memcache::decrement – 对保存的某个key中的值进行减法操作Memcache::delete – 删除一个key值Memcache::flush – 清除所有缓存的数据Memcache::get – 获取一个key值Memcache::getExtendedStats – 获取进程池中所有进程的运行系统统计Memcache::getServerStatus – 获取运行服务器的参数Memcache::getStats – 返回服务器的一些运行统计信息Memcache::getVersion – 返回运行的Memcache的版本信息Memcache::increment – 对保存的某个key中的值进行加法操作Memcache::pconnect – 创建一个Memcache的持久连接对象Memcache::replace -对一个已有的key进行覆写操作Memcache::set – 添加一个值,如果已经存在,则覆写Memcache::setCompressThreshold – 对大于某一大小的数据进行压缩Memcache::setServerParams – 在运行时修改服务器的参数五、PHP的Memcache操作方法分解Memcache::add用法复制代码代码如下:bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]] )说明:如果$key不存在的时候,使用这个函数来存储$var的值。功能相同的函数是memcache_add()。参数:$key :将要存储的键值。$var :存储的值,字符型和整型会按原值保存,其他类型自动序列化以后保存。$flag:是否用MEMCACHE_COMPRESSED来压缩存储的值,true表示压缩,false表示不压缩。$expire:存储值的过期时间,如果为0表示不会过期,你可以用unix时间戳或者描述来表示从现在开始的时间,但是你在使用秒数表示的时候,不要超过2592000秒 (表示30天)。返回值:如果成功则返回 TRUE,失败则返回 FALSE。如果$key值已经存在,则会返回FALSE。 其他情况下Memcache::add()的用法类似于Memcache::set()。例子:复制代码代码如下:<?php$memcache_obj = memcache_connect(”localhost”, 11211);memcache_add($memcache_obj, 'var_key', 'test variable', false, 30);$memcache_obj->add('var_key', 'test variable', false, 30);?>Memcache::addServer用法复制代码代码如下:bool Memcache::addServer ( string $host [, int $port [, bool $persistent [, int $weight [, int$timeout [, int $retry_interval [, bool $status [, callback $failure_callback ]]]]]]] )说明:添加一个可供使用的服务器地址到连接池中,连接用Memcache::addServer打开,脚本执行完后自动关闭,或者可以用Memcache::close()手动关闭。相同函数是memcache_add_server()。当用这个方法的时候(相对于Memcache::connect()和 Memcache::pconnect()方法),网络连接只有等需要的时候才会建立,因此不会因为增加很多的服务器到连接池而增加系统负担,因为很多服务器可能没有使用。故障恢复会发生在这个方法执行的任何阶段,只要其他的服务器是正常的,这些连接请求的失败用户不会注意到。任何一种socket或者memcached服务器级的错误可以触发故障恢复。正常的客户端错误比如增加一个存在的键值不会引发故障恢复。参数:$host服务器的地址$port服务器端口$persistent是否是一个持久连接$weight这台服务器在所有服务器中所占的权重$timeout连接的持续时间$retry_interval连接重试的间隔时间,默认为15,设置为-1表示不进行重试$status控制服务器的在线状态$failure_callback允许设置一个回掉函数来处理错误信息。返回值:如果成功则返回 TRUE,失败则返回 FALSE。例子:复制代码代码如下:<?php$memcache = new Memcache;$memcache->addServer('memcache_host', 11211);$memcache->addServer('memcache_host2′, 11211);$memcache_obj = memcache_connect('memcache_host', 11211);memcache_add_server($memcache_obj, 'memcache_host2′, 11211);?>Memcache::close用法bool Memcache::close ( void )说明:关闭memcache服务器连接。这个函数不会关闭长连接,长连接只有在web服务器关闭或者重启的时候才会关闭。相同的函数memcache_close()返回值:如果成功则返回 TRUE,失败则返回 FALSE。例子:复制代码代码如下:<?php$memcache_obj = memcache_connect('memcache_host', 11211);memcache_close($memcache_obj);$memcache_obj = new Memcache;$memcache_obj->connect('memcache_host', 11211);$memcache_obj->close();?>Memcache::connect用法复制代码代码如下:bool Memcache::connect ( string $host [, int $port [, int $timeout ]] )说明:打开memcached服务器连接,建立一个到memcached服务器的连接,用Memcache::connect打开的连接会在脚本执行完毕后自动关闭。你也可以用Memcache::close()去关闭连接。相同的函数是memcache_connect()。参数:$host:指向memcached正在收听的链接的主机,这个参数会有另一种特殊的连接方式unix:///path/to/memcached.sock,即用unix的域名sockets,这种情况下,端口必须设置为0$port:指向memcached正在收听的链接的端口,用unix的域名sockets的情况下,端口必须设置为0$timeout:用于连接守护进程的秒数,当你改变默认的1秒的值的时候,你需要考虑一下,如果你的连接太慢的话,你可能会失去缓存的优势。返回值:如果成功则返回 TRUE,失败则返回 FALSE。例子:复制代码代码如下:<?php$memcache_obj = memcache_connect('memcache_host', 11211);$memcache = new Memcache;$memcache->connect('memcache_host', 11211);?>memcache::debug复制代码代码如下:bool memcache_debug ( bool $on_off )说明:控制调试功能,前提是php在编译的时候使用了-enable-debug选项,否则这个函数不会有作用。参数:$on_off:true表示开启调试,false表示关闭调试返回值:如果php在编译的时候使用了-enable-debug选项,返回true,否则返回falseMemcache::decrement用法复制代码代码如下:int Memcache::decrement ( string $key [, int $value ] )说明:Memcache::decremen方法的作用是对保存的某个key中的值进行减法操作,用法跟Memcache::increment类似。你也可以用memcache_decrement()函数。参数:Key:想要减少的键的名字Value:想要减少的值。返回值:如果成功,返回被减少后的值,如果失败返回false。例子:复制代码代码如下:<?php$memcache = new Memcache;$memcache->connect('localhost', 11211);$memcache->set('test_item', 8);$memcache->increment('test_item', 4);echo $memcache->decrement('test_item', 7);// 显示 5?>这个例子连Memcache::increment函数都一块演示了。Memcache::delete用法复制代码代码如下:bool Memcache::delete ( string $key [, int $timeout ] )说明:删除一个key值,如果参数$timeout被设置,那么存储的值会在设置的秒数以后过期,你也可以用函数memcache_delete()返回值:如果成功则返回 TRUE,失败则返回 FALSE。例子:复制代码代码如下:<?php$memcache_obj = memcache_connect('memcache_host', 11211);memcache_delete($memcache_obj, 'key_to_delete', 10);$memcache_obj = new Memcache;$memcache_obj->connect('memcache_host', 11211);$memcache_obj->delete('key_to_delete', 10);?>Memcache::flush复制代码代码如下:bool Memcache::flush ( void )说明:清除所有缓存的数据。Memcache::flush实际上没有释放资源,它仅仅将所有的缓存标记为过期,这样可以使新的缓存来覆盖被占的内存空间。一样的函数是memcache_flush()返回值:如果成功则返回 TRUE,失败则返回 FALSE。例子:复制代码代码如下:<?php$memcache_obj = memcache_connect('memcache_host', 11211);memcache_flush($memcache_obj);$memcache_obj = new Memcache;$memcache_obj->connect('memcache_host', 11211);$memcache_obj->flush();?>Memcache::get复制代码代码如下:string Memcache::get ( string $key [, int &$flags ] )array Memcache::get ( array $keys [, array &$flags ] )说明:方法的作用是获取一个key值,key值可以是一个数组,结果会包含键值对。参数:$key是键值或者一个键的数组值。$flags如果这个参数存在,那么$flags跟写入这个参数的值相关,这些$flags 类似于Memcache::set()函数里的$flags。返回值:如果成功,则返回key对应的值,如果失败则返回false.例子:复制代码代码如下:<?php$memcache_obj = memcache_connect('memcache_host', 11211);$var = memcache_get($memcache_obj, 'some_key');$memcache_obj = new Memcache;$memcache_obj->connect('memcache_host', 11211);$var = $memcache_obj->get('some_key');$memcache_obj = memcache_connect('memcache_host', 11211);$var = memcache_get($memcache_obj, Array('some_key', 'another_key'));$memcache_obj = new Memcache;$memcache_obj->connect('memcache_host', 11211);$var = $memcache_obj->get(Array('some_key', 'second_key'));?>Memcache::getExtendedStats复制代码代码如下:array Memcache::getExtendedStats ([ string $type [, int $slabid [, int $limit ]]] )说明:获取进程池中所有进程的运行系统统计。相同函数是memcache_get_extended_stats()参数:$type表示要求返回的类型:reset, malloc, maps, cachedump, slabs, items, sizes;$slabid第一个参数设置为”cachedump”时使用的。$limit第一个参数设置为”cachedump”时使用的。返回值:如果成功,返回统计信息,失败会返回false例子:复制代码代码如下:<?php$memcache_obj = new Memcache;$memcache_obj->addServer('memcache_host', 11211);$memcache_obj->addServer('failed_host', 11211);$stats = $memcache_obj->getExtendedStats();//slabs机制分配管理内存的情况$statsslab = $memcache_obj->getExtendedStats(slabs);?>Memcache::getServerStatus复制代码代码如下:int Memcache::getServerStatus ( string $host [, int $port ] )说明:获取运行服务器的参数。返回一个服务器在线或者离线的状态。相同的函数是memcache_get_server_status()参数:$host:正在收听的连接的主机$port正在收听的连接的主机的端口,默认是11211返回值:成功返回服务器状态,服务器没有启动会返回0,其他数字的时候表示服务器是启动状态的。例子:复制代码代码如下:<?php$memcache = new Memcache;$memcache->addServer('memcache_host', 11211);echo $memcache->getServerStatus('memcache_host', 11211);$memcache = memcache_connect('memcache_host', 11211);echo memcache_get_server_status($memcache, 'memcache_host', 11211);?>Memcache::getStats复制代码代码如下:array Memcache::getStats ([ string $type [, int $slabid [, int $limit ]]] )说明:返回服务器的一些运行统计信息。相同的函数是memcache_get_stats()参数:$type表示要求返回的类型:reset, malloc, maps, cachedump, slabs, items, sizes;$slabid第一个参数设置为”cachedump”时使用的。$limit第一个参数设置为”cachedump”时使用的。Memcache::getVersion复制代码代码如下:string Memcache::getVersion ( void )说明:返回运行的Memcache的版本信息。相同函数memcache_get_version()返回值:成功返回服务器的版本信息,失败的时候返回false。例子:复制代码代码如下:<?php$memcache = new Memcache;$memcache->connect('memcache_host', 11211);echo $memcache->getVersion();$memcache = memcache_connect('memcache_host', 11211);echo memcache_get_version($memcache);?>Memcache::increment复制代码代码如下:int Memcache::increment ( string $key [, int $value ] )对保存的某个key中的值进行加法操作用法参考Memcache::decrementMemcache::pconnect复制代码代码如下:bool Memcache::pconnect ( string $host [, int $port [, int $timeout ]] )说明:创建一个Memcache的持久连接对象用法与Memcache::connect()相似,不同点地方是Memcache::pconnect是建立的持久连接。这个连接在脚本执行完或者Memcache::close()函数运行也不会被关闭。与它相同的函数是memcache_pconnect()参数:$host:指向memcached正在收听的链接的主机,这个参数会有另一种特殊的连接方式unix:///path/to/memcached.sock,即用unix的域名sockets,这种情况下,端口必须设置为0$port:指向memcached正在收听的链接的端口,用unix的域名sockets的情况下,端口必须设置为0$timeout:用于连接守护进程的秒数,当你改变默认的1秒的值的时候,你需要考虑一下,如果你的连接太慢的话,你可能会失去缓存的优势。返回值:如果成功则返回 TRUE,失败则返回 FALSE复制代码代码如下:<?php$memcache_obj = memcache_pconnect('memcache_host', 11211);$memcache_obj = new Memcache;$memcache_obj->pconnect('memcache_host', 11211);?>Memcache::replace复制代码代码如下:bool Memcache::replace ( string $key , mixed $var [, int $flag [, int $expire ]] )说明:对一个已有的key进行覆写操作。相同函数是memcache_replace()参数:$key :将要存储的键值。$var :存储的值,字符型和整型会按原值保存,其他类型自动序列化以后保存。$flag:是否用MEMCACHE_COMPRESSED来压缩存储的值,true表示压缩,false表示不压缩。$expire:存储值的过期时间,如果为0表示不会过期,你可以用unix时间戳或者描述来表示从现在开始的时间,但是你在使用秒数表示的时候,不要超过2592000秒 (表示30天)。返回值:如果成功则返回 TRUE,失败则返回 FALSE。如果$key值已经存在,则会返回FALSE。复制代码代码如下:<?php$memcache_obj = memcache_connect('memcache_host', 11211);memcache_replace($memcache_obj, "test_key", "some variable", false, 30);$memcache_obj->replace("test_key", "some variable", false, 30);?>Memcache::set复制代码代码如下:bool Memcache::set ( string $key , mixed $var [, int $flag [, int $expire ]] )说明:添加一个值,如果已经存在,则覆写。相同函数是memcache_set()参数:$key :将要存储的键值。$var :存储的值,字符型和整型会按原值保存,其他类型自动序列化以后保存。$flag:是否用MEMCACHE_COMPRESSED来压缩存储的值,true表示压缩,false表示不压缩。$expire:存储值的过期时间,如果为0表示不会过期,你可以用unix时间戳或者描述来表示从现在开始的时间,但是你在使用秒数表示的时候,不要超过2592000秒 (表示30天)。返回值:如果成功则返回 TRUE,失败则返回 FALSE。例子:复制代码代码如下:$memcache_obj = new Memcache;$memcache_obj->connect('memcache_host', 11211);$memcache_obj->set('var_key', 'some really big variable', MEMCACHE_COMPRESSED, 50);echo $memcache_obj->get('var_key');Memcache::setCompressThreshold复制代码代码如下:bool Memcache::setCompressThreshold ( int $threshold [, float $min_savings ] )说明:对大于某一大小的数据进行压缩。相同的函数是memcache_set_compress_threshold()参数:setCompressThreshold方法有两个参数,第一个参数表示处理数据大小的临界点,第二个参数表示压缩的比例,默认为0.2。返回值:如果成功则返回 TRUE,失败则返回 FALSE。例子:复制代码代码如下:<?php$memcache_obj = new Memcache;$memcache_obj->addServer('memcache_host', 11211);$memcache_obj->setCompressThreshold(20000, 0.2);$memcache_obj = memcache_connect('memcache_host', 11211);memcache_set_compress_threshold($memcache_obj, 20000, 0.2);?>Memcache::setServerParams复制代码代码如下:bool Memcache::setServerParams ( string $host [, int $port [, int $timeout [, int$retry_interval [, bool $status [, callback $failure_callback ]]]]] )说明:在运行时修改服务器的参数。相同函数是memcache_set_server_params()。参数:$host服务器的地址$port服务器端口$timeout连接的持续时间$retry_interval连接重试的间隔时间,默认为15,设置为-1表示不进行重试$status控制服务器的在线状态$failure_callback允许设置一个回掉函数来处理错误信息。返回值:如果成功则返回 TRUE,失败则返回 FALSE。例子:复制代码代码如下:<?phpfunction _callback_memcache_failure($host, $port) {print "memcache '$host:$port' failed";}$memcache = new Memcache;// 离线模式增加一个服务器$memcache->addServer('memcache_host', 11211, false, 1, 1, -1, false);// 把服务器设成在线$memcache->setServerParams('memcache_host', 11211, 1, 15, true, '_callback_memcache_failure');$memcache_obj = memcache_connect('memcache_host', 11211);memcache_set_server_params($memcache_obj, 'memcache_host', 11211, 1, 15, true, '_callback_memcache_failure');?>六、综合使用实例复制代码代码如下:<?php//连接$mem = new Memcache;$mem->connect("db.nowamagic.net", 12000);//保存数据$mem->set('key1', 'This is first value', 0, 60);$val = $mem->get('key1');echo "Get key1 value: " . $val ."";//替换数据$mem->replace('key1', 'This is replace value', 0, 60);$val = $mem->get('key1');echo "Get key1 value: " . $val . "";//保存数组$arr = array('aaa', 'bbb', 'ccc', 'ddd');$mem->set('key2', $arr, 0, 60);$val2 = $mem->get('key2');echo "Get key2 value: ";print_r($val2);echo "";//删除数据$mem->delete('key1');$val = $mem->get('key1');echo "Get key1 value: " . $val . "";//清除所有数据$mem->flush();$val2 = $mem->get('key2');echo "Get key2 value: ";print_r($val2);echo "";//关闭连接$mem->close();?>如果正常的话,浏览器将输出:复制代码代码如下:Get key1 value: This is first valueGet key1 value: This is replace valueGet key2 value: Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd )Get key1 value:Get key2 value:七、实例程序代码分析初始化一个Memcache的对象:$mem = new Memcache;连接到我们的Memcache服务器端,第一个参数是服务器的IP地址,也可以是主机名,第二个参数是Memcache的开放的端口:$mem->connect("192.168.0.200", 12000);保存一个数据到Memcache服务器上,第一个参数是数据的key,用来定位一个数据,第二个参数是需要保存的数据内容,这里是一个字符串,第三个参数是一个标记,一般设置为0或者MEMCACHE_COMPRESSED就行了,第四个参数是数据的有效期,就是说数据在这个时间内是有效的,如果过去这个时间,那么会被Memcache服务器端清除掉这个数据,单位是秒,如果设置为0,则是永远有效,我们这里设置了60,就是一分钟有效时间:$mem->set(‘key1‘, ‘This is first value', 0, 60);从Memcache服务器端获取一条数据,它只有一个参数,就是需要获取数据的key,我们这里是上一步设置的key1,现在获取这个数据后输出输出:复制代码代码如下:$val = $mem->get('key1′);echo "Get key1 value: " . $val;现在是使用replace方法来替换掉上面key1的值,replace方法的参数跟set是一样的,不过第一个参数key1是必须是要替换数据内容的key,最后输出了:复制代码代码如下:$mem->replace('key1', 'This is replace value', 0, 60);$val = $mem->get('key1');echo "Get key1 value: " . $val;同样的,Memcache也是可以保存数组的,下面是在Memcache上面保存了一个数组,然后获取回来并输出:复制代码代码如下:$arr = array('aaa', 'bbb', 'ccc', 'ddd');$mem->set('key2', $arr, 0, 60);$val2 = $mem->get('key2');print_r($val2);现在删除一个数据,使用delte接口,参数就是一个key,然后就能够把Memcache服务器这个key的数据删除,最后输出的时候没有结果:复制代码代码如下:$mem->delete('key1');$val = $mem->get('key1');echo "Get key1 value: " . $val . "";最后我们把所有的保存在Memcache服务器上的数据都清除,会发现数据都没有了,最后输出key2的数据为空,最后关闭连接:复制代码代码如下:$mem->flush();$val2 = $mem->get('key2');echo "Get key2 value: ";print_r($val2);echo "";八、什么时候使用Memcache和Memcache的使用环境使用Memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让Memcache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅速的进行存取。那么一般的焦点就是集中在如何分担数据库压力和进行分布式,毕竟单台Memcache的内存容量的有限的。我这里简单提出我的个人看法,未经实践,权当参考。分布式应用Memcache本来支持分布式,我们客户端稍加改造,更好的支持。我们的key可以适当进行有规律的封装,比如以user为主的网站来说,每个用户都有User ID,那么可以按照固定的ID来进行提取和存取,比如1开头的用户保存在第一台Memcache服务器上,以2开头的用户的数据保存在第二胎Mecache服务器上,存取数据都先按照User ID来进行相应的转换和存取。但是这个有缺点,就是需要对User ID进行判断,如果业务不一致,或者其他类型的应用,可能不是那么合适,那么可以根据自己的实际业务来进行考虑,或者去想更合适的方法。减少数据库压力这个算是比较重要的,所有的数据基本上都是保存在数据库当中的,每次频繁的存取数据库,导致数据库性能极具下降,无法同时服务更多的用户,比如MySQL,特别频繁的锁表,那么让Memcache来分担数据库的压力吧。我们需要一种改动比较小,并且能够不会大规模改变前端的方式来进行改变目前的架构。我考虑的一种简单方法:后端的数据库操作模块,把所有的Select操作提取出来(update/delete/insert不管),然后把对应的SQL进行相应的hash算法计算得出一个hash数据key(比如MD5或者SHA),然后把这个key去Memcache中查找数据,如果这个数据不存在,说明还没写入到缓存中,那么从数据库把数据提取出来,一个是数组类格式,然后把数据在set到Memcache中,key就是这个SQL的hash值,然后相应的设置一个失效时间,比如一个小时,那么一个小时中的数据都是从缓存中提取的,有效减少数据库的压力。缺点是数据不实时,当数据做了修改以后,无法实时到前端显示,并且还有可能对内存占用比较大,毕竟每次select出来的数据数量可能比较巨大,这个是需要考虑的因素。九、Memcache的安全我们上面的Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄露被其他无关人员查看,重则服务器被入侵,因为Mecache是以root权限运行的,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,所以危险性是可以预见的。为了安全起见,我做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。内网访问最好把两台服务器之间的访问是内网形态的,一般是Web服务器跟Memcache服务器之间。普遍的服务器都是有两块网卡,一块指向互联网,一块指向内网,那么就让Web服务器通过内网的网卡来访问Memcache服务器,我们Memcache的服务器上启动的时候就监听内网的IP地址和端口,内网间的访问能够有效阻止其他非法的访问。复制代码代码如下:memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pidMemcache服务器端设置监听通过内网的192.168.0.200的ip的11211端口,占用1024MB内存,并且允许最大1024个并发连接。设置防火墙防火墙是简单有效的方式,如果却是两台服务器都是挂在网的,并且需要通过外网IP来访问Memcache的话,那么可以考虑使用防火墙或者代理程序来过滤非法访问。一般我们在Linux下可以使用iptables或者FreeBSD下的ipfw来指定一些规则防止一些非法的访问,比如我们可以设置只允许我们的Web服务器来访问我们Memcache服务器,同时阻止其他的访问。复制代码代码如下:iptables -Fiptables -P INPUT DROPiptables -A INPUT -p tcp -s 192.168.0.2 –dport 11211 -j ACCEPTiptables -A INPUT -p udp -s 192.168.0.2 –dport 11211 -j ACCEPT上面的iptables规则就是只允许192.168.0.2这台Web服务器对Memcache服务器的访问,能够有效的阻止一些非法访问,相应的也可以增加一些其他的规则来加强安全性,这个可以根据自己的需要来做。
2023年08月08日
12 阅读
0 评论
0 点赞
2023-08-08
2013PHP技术峰会《Bug Free的PHP开发实践分享》摘录
2013PHP技术峰会《Bug Free的PHP开发实践分享》摘录上次参加了2013PHP技术峰会,非常精彩,很受益。最近空闲下来,把嘉宾的PPT下载下来看了一通,当然有大牛的主题对我这个菜鸟来说还是看不懂。这里摘录了@高春辉 老师的《Bug Free 的 PHP 开发实践分享》的主题分享内容,我觉得很有价值很有实践指导意义,没有晦涩的技术流,但是很多都是PHP实践中值得注意的细节点。要想代码写的好,前提配置做的好error_reporting = E_ALL | E_STRICTdisplay_errors = 测试机设置为 On,生产机设置为 Offdisplay_startup_errors = Onlog_errors = Onerror_log = /home/logs/phperror.log写代码的时候要时刻注意的问题1、变量必须要初始化,函数或者类的方法的参数要有类型定义;2、能用 ===、!== 就不用 == 和 != ;3、对外来变量要做防卫式检查;4、不要只考虑正常逻辑,多考虑边界情况;5、涉及 SQL 以及文件操作要想象各种可能性,尽量在框架级别做好约束,不要依赖开发人员的能力;6、要让好的习惯成为你的本能!一些经验1、单入口;入口对一些容易出问题的事情进行检查和初始化,让程序员可以把精力集中在应用层。比如服务器时间出错检查,路径初始化,GET、POST、FILES 、SERVER 等全局变量的初始化,等等。2、用类封装代码;3、做好 Autoload,善用 NameSpace;4、接管异常处理,在代码里尽量抛异常;5、尽量使用原生和 PECL 扩展函数;6、代码里慎用 @ 符;7、为对 CDN 更友善,框架默认输出 no-cache 头,需要时再改变,并尽量把动态请求和静态资源分开;8、如果有文件上传功能,可以在入口处这样处理而不需要程序员来操心删掉临时文件:register_shutdown_function(‘removeFILESOnShutdown’);9、在允许的情况下,升级到更高 PHP 版本;10、通过 Xdebug 调试,使用 XHProf 了解性能问题并改进;11、APC、OpCache、Memcached 还用我说吗?但是在此之上最好再做一层封装,方便以后迁移和调试;12、多做 Code Review,三个月后再看自己的代码;13、框架和底层代码一定要经得起最严格的考验;14、一定要在最严格的方式下开发与测试,最好有独立的测试机;15、降低未来的维护成本,编码规范与代码规范,要严格执行,前者可以用 PHP_CodeSniffer 在提交到代码仓库时检查;16、服务分层,图像处理等耗时操作,不要和 web 服务混在一起。一个小技巧,一些无须用户关心的操作,比如记录用户信息,可以集中放到程序最后使用 fastcgi_finish_request() 方法在断开用户连接后执行。17、MySQL 数据库的运行状态可用 mysqltuner.pl 和 tuning-primer.sh 来检查;18、服务器以及服务的运行状态,要有及时的监控和报警,没精力,可以用监控宝。我们自己,走的更远1、框架会 unset 掉 GET、POST、COOKIE 等相关数据,对一些外来数据做初始化,比如 GET 操作下,FILES 变量会被清空,必须通过我们自己封装的方法进行外来数据的获取;2、我们针对前端 HTML 代码,分割静态资源并作自动优化,无须人工干预;3、文件储存实现了统一化,自动去重,这样对开发用户上传内容型的应用非常方便,而且一点都不用担心被上传注入;4、我们有专门的任务处理服务,通过 FastCGI 协议与前端进行通信,省掉 HTTP 层的开销;5、不仅 Web 是单一入口,任务处理、命令行和计划任务都做了单一入口。
2023年08月08日
9 阅读
0 评论
0 点赞
2023-08-08
用Zephir编写PHP扩展
用Zephir编写PHP扩展自从NodeJS,和Golang出来后,很多人都投奔过去了。不为什么,冲着那牛X的性能。那PHP的性能什么时候能提升一下呢?要不然就会被人鄙视了。其实大牛们也深刻体会到了这些威胁,于是都在秘密开发各种秘密武器。HHVM和HackFacebook自己弄了一套HHVM虚拟机,和一个新语言Hack。HHVM的性能不错,像Wordpress,PHPMyAdmin这样的项目,运行在上面很流畅,但是有个问题很致命,如果你引入了第三方扩展,现有的代码移植过去,没办法运行。如果你希望你的代码运行于HHVM,那么你需要编写基于HHVM的扩展,这时候你要学习C++了。很抓狂有木有?又或者,用Hack重写你的代码,这事谁会干呢?新项目可能可以拿来玩玩,但是旧的项目,如果代码量大,且代码混乱的项目,那就只能呵呵了。PHPNG(next generation)前些日子PHP核心开发组宣布了个利好消息,将在PHP 5.7版本会有很大的性能提升。这一次又打击到HHVM了。但是要等到5.7的版本才会发布。现在很多都只是停留在5.4的版本,鞭长莫及啊。除了这些,就没有办法提升性能了吗?有!------ PHP扩展。Phalcon没听过,Yaf总听过了吧。什么?都没听过?赶紧去Google下,听说面试会加分。PHP扩展PHP的流行,得益于它的扩展系统。开发者通过为PHP开发扩展,通过这个中间件,跟其他系统连接通信。例如我们常用的cURL,Memcache和Redis等扩展。这些扩展不包含在PHP核心,需要额外编译。这里有一份官方列出的PHP扩展列表:http://www.php.net/manual/en/extensions.alphabetical.php如果你想自己编写PHP扩展,意味着你需要掌握C语言,因为PHP的扩展是通过C编写的,而且你还需要掌握PHP的Zend API,了解它的核心原理。如果你有兴趣,可以参考:《深入理解PHP内核》。如果你懂C,那么你看完上面这本书,那么你大概也能写了。但是,对于C语言水平比较菜,或者不怎么懂C的人来说,就只能望而却步了。为什么我要写PHP扩展呢?访问现有的库。假设现在有一个库很好用(例如MongoDB),你希望在PHP也能用上它。如果这个库很热门,那么你就走运了,应该有大牛帮你实现了。要是运气不好,这个库比较冷门,但你业务需求又刚好需要用到的话,那只能干着急了(当然这种情况是极少出现的)。性能。PHP是动态语言,代码性能比C语言相差一个级别。正是由于此原因,产生了Yaf,Phalcon这样的PHP的扩展框架。对于那些不想学C,但又想要得到编写自己的扩展,怎么办?Zephir分析了以上的种种不靠谱,终于进入了正题。现在隆重向你介绍一个叫Zephir的项目。它可以帮助你使用类PHP的语法,来生成C语言代码,并帮助你编译成PHP扩展。是不是很酷?很酷,有没有?Show Me The Code如果你用C写一个Hello World的扩展,那么你需要这样写:ifdef HAVE_CONFIG_Hinclude "config.h"endifinclude "php.h"include "php_test.h"include "test.h"include "kernel/main.h"/**This is a sample class */ZEPHIR_INIT_CLASS(Test_Hello) {ZEPHIR_REGISTER_CLASS(Test, Hello, hello, test_hello_method_entry, 0); return SUCCESS;}/**This is a sample method */PHP_METHOD(Test_Hello, say) {php_printf("%s", "Hello World!");}而Zephir则只需要这样:01.namespace Test;02.03./**04.* This is a sample class05.*/06.class Hello07.{08./**09.* This is a sample method10.*/11.public function say()12.{13.echo "Hello World!";14.}15.}是不是跟写PHP代码没什么区别?安装 Zephir1.$ git clone https://github.com/json-c/json-c.git2.$ cd json-c3.$ sh autogen.sh4.$ ./configure5.$ make && sudo make install1.$ git clone https://github.com/phalcon/zephir2.$ cd zephir3.$ ./install -c安装完成后,运行1.$ zephir help如果没有报错,说明你已经安装成功了。Zephir语法Zephir跟PHP有几点区别:Zephir是强类型语言。变量有自己的类型。01.namespace Test;02.03.class Arithmetic04.{05.public function intSum()06.{07.int a, b, c;08.09.let a = 1,10.b = 2,11.c = a + b;12.13.return c;14.}15.}这里需要特别注意的是Zephir有个let关键字,用于变量赋值。编译扩展初始化一个Zephir扩展1.zephir init myframework新建一个叫 calculator.zep的文件1.namespace Myframework;2.class Calculator {3.public function add(int a, int b) {4.return a + b;5.}6.}Zephir必须指定一个命名空间,上面的例子Myframework为这次Demo的命名空间。Zephir遵循PSR-1的标准进行命名。把Zephir代码编译成PHP的C扩展1.zephir build开启扩展在你的php.ini文件加上1.extension=myframework.so测试1.$ php -a2.php > $calc = new Myframework\Calculator;3.php > var_dump($calc->add(2, 1));4.int(3)是不是很简单?你也来尝试一下吧。用Zephir开发PHP扩展
2023年08月08日
24 阅读
0 评论
0 点赞
1
...
17
18
19
20