
PHP笔记
序冢--磊
这个作者很懒,什么都没留下…
展开
-
关于打洞技术的小实验
打洞其实很简单,写一个打洞服务器,然后客户端把自己路由器的ip和端口注册到打洞服务器上,然后打洞服务器去告诉另一个客户端,希望交流的客户端路由器的ip和端口,因为路由器有NAT和NATP,对外暴露的ip和端口不一定是本机的,在这里主要做本地的模拟,线上的其实也很简单,tcp与udp都可以打洞通讯框架用的swoole,通讯技术和语言没有任何关系,不要纠结语言一个打洞服务器:<?php$arr = [];$server = new Swoole\Server('127.原创 2021-07-24 15:15:53 · 311 阅读 · 0 评论 -
imi在虎扑上亿数据迁移实践
1.项目背景:随着数据规模的越来越大,mysql已经不能适用大数据多维度的查询,需要用ES等一类的搜索引擎,进行多维度的分词查询,现阶段适用按天分表,不能满足跨天的长时间查询,如何以最快的速度完成数据迁移,将数据库中的数据迁移到ES中,是需要评估的一个重要技术点2.根本问题:mysql适合做数据落地,在大量业务数据存储的情况下,like查询效率低,不适合多维度查询3.使用IMI作为数据迁移的微服务Server首先使用imi作为微服务框架,集成了Eureka,普罗米...原创 2021-02-02 23:43:24 · 3837 阅读 · 3 评论 -
rig扩展源码分析
rig扩展源码分析你可能会问rig是什么,如果是虎扑php-fpm重要的监控中间件,在日常监控上报数据指标中具有举足轻重的重要地位。rig在php的使用中以扩展的形式融入到日常使用中,下面我们分析一下rig的实现过程。如何分析一个php扩展是如何做的?那肯定是要首先看zend生命周期中的一些钩子函数中都做了什么比如 分析 global_init、rinit、minit等等首先看模块初始化函数minit做了什么PHP_MINIT_FUNCTION (rig) { ZEND_INIT_MODU原创 2020-10-03 11:01:57 · 506 阅读 · 0 评论 -
js同步语法
asyncfunctiontest(){for(leti=0;i<9;i++){awaitfetch("http://www.baidu.com");}}原创 2020-04-08 16:39:18 · 219 阅读 · 0 评论 -
redis使用规范
文章使用:https://blog.youkuaiyun.com/xwc35047/article/details/82987279在工作中使用redis一段时间,整理了一些常见问题和规范。常见问题1、全量查询元素使用 zrange key 0 -1 命令导致慢查询,这个命令直接查询全量元素,当元素个数过万会导致慢查询。2、key没有加超时时间因为redis是使用内存存储,而内存的容量...转载 2020-04-01 12:40:37 · 278 阅读 · 0 评论 -
php调试方法总结
这几天看完了php的虚拟机和词法解析,写下这篇日志来将php的调试方法做一个总结,像一些最简单的var_dump,die这种入门级调试技巧就不说了,这种var_dump die的方法在fpm上还好说,但是如果是守护进程就需要破坏现场,重启服务。写日志有的时候也很难命中进程现场的运行情况。如果我们运行了一个守护进程陷入了死循环或者阻塞希望知道这个程序的运行位置,或者希望知道程序里发生了什么...原创 2020-02-04 16:25:34 · 932 阅读 · 0 评论 -
Zend虚拟机部分的学习
Zend虚拟机部分的学习之前大体看了zend ast语法部分的解析,也用gdb大体看了zend语法树的运行结果,但是读完之后我会思考问题,就是语法全部挂到ast上,那么ast是如何变成一个个opcode然后组成op_array的呢,zend虚拟机又是怎么一个个执行这个opcode的呢?记得2年前,我面试有一些很资深的程序员就会问我,你了解op_array呢?但是当年没看过php源码,但是写...原创 2020-02-03 18:03:06 · 406 阅读 · 0 评论 -
zend抽象语法树AST流程解析
年底了空闲一些,开始看zend虚拟机,还有几天过年了,写下这篇学习笔记,简单的介绍一下我近期对zend虚拟机的学习我最近学习了zend虚拟机,首先了解到了一个东西re2c+bisonphp正是通过这个东西对php脚本进行的解析,这个我的初步了解是在php 胖子的tipi上http://www.php-internals.com/book/?p=chapt07/07-00-zend-...原创 2020-01-21 15:30:35 · 1024 阅读 · 0 评论 -
zend虚拟机的学习(一)
Zend虚拟机部分的学习学习自网址:http://www.php-internals.com/book/?p=chapt07/07-01-zend-vm-overview我之前也是一直非常奇怪php是如何把php编译成机械码的,2年前看zend虚拟机的文章云山雾绕,这一次又开始看zend虚拟机是如何实现的,tipi比较老了,但是还是在一些方面很具有借鉴经验,因为毕竟php根还在那里,不可能...原创 2020-01-12 17:25:18 · 436 阅读 · 0 评论 -
zend扩展关于模块初始化的体会
zend开发如何获取模块我其实在思考一个问题,我在写扩展的时候每次要给某某model写 PHP_MINIT_FUNCTION,今天又在思考一个问题 其实只要php内核拿到module名字然后用一个宏定义,就可以获取到对应模块的结构体#define ZEND_GET_MODULE(name) \ BEGIN_EXTERN_C()\ ZEND_DLEXPORT zend_mo...原创 2020-01-03 20:44:37 · 204 阅读 · 1 评论 -
关于zend内存管理的学习
看了一个多月zend的内存管理,查了很多资料,看了书籍<<unix高级环境编程>>和<<linux系统编程>>中进程环境以及系统内存管理部分的章节参考了博客(如何实现一个malloc)http://blog.codinglabs.org/articles/a-malloc-tutorial.html(php内存管理)https://b...原创 2019-12-31 10:42:49 · 489 阅读 · 1 评论 -
一个延时队列服务Beanstalkd
安装和启动:yum -y install beanstalkd配置文件默认在 /etc/sysconfig/beanstalkdnohup /usr/local/bin/beanstalkd -l 0.0.0.0-b /mnt/beanstalkd &特点:拉模式:消费者需要主动从服务器拉取消息数据;tube:类似于消息主题topic,一个beanstalkd中可以支...转载 2019-12-25 11:07:36 · 400 阅读 · 0 评论 -
PHP 内核级监控 skywalking 已上线 PECL 可使用 pecl install skywalking 安装
PHP 内核级监控 skywalking 已上线 PECL 可使用 pecl install skywalking 安装https://pecl.php.net/package/skywalkinghttps://skywalking.apache.org/原创 2019-12-17 18:34:49 · 1998 阅读 · 0 评论 -
redis内存占用过大问题解决
redis内存占用过大问题解决今天运维让我去追查redis问题,redis占用的内存比较大,进行清理之后发现redis还有很大的内存占用,于是就想到看一下现在哪些健值还在被追加于是输入monitor指令 "ZADD" "1100_199_164" "1574931496" "28591088"1574931496.760710 "ZADD" "1100_199_0" ...原创 2019-11-28 17:09:51 · 3321 阅读 · 3 评论 -
ZEND 中的 EXPECTED 和 UNEXPECTED
__builtin_expect这几天研究zend源码看到了#if PHP_HAVE_BUILTIN_EXPECT# define EXPECTED(condition) __builtin_expect(!!(condition), 1)# define UNEXPECTED(condition) __builtin_expect(!!(condition), 0)#else...原创 2019-11-27 16:30:48 · 250 阅读 · 1 评论 -
zend中的php_cgi_globals_ctor分析
我们继续往下读,这时候看到了一个函数php_cgi_globals_ctor(&php_cgi_globals);从名字上就可以看出这是一个初始化php_cgi_globals这个结构体的,这个结构体是typedef struct _php_cgi_globals_struct { HashTable user_config_cache; char *re...原创 2019-11-20 21:49:14 · 246 阅读 · 0 评论 -
trait 中的函数名和本类 以及 基类发生冲突
<?phptrait trait1{ public function eat(){ echo "This is trait1 eat"; } public function drive(){ echo "This is trait1 drive"; }}trait trait2{ public function e...原创 2019-11-12 21:24:54 · 318 阅读 · 0 评论 -
redis加锁的方式
<?php/** * Created by PhpStorm. * User: chelun * Date: 2018/12/26 * Time: 下午8:15 */namespace App\Util;use Illuminate\Support\Facades\Redis;class RedisLock{ const LOCK_KEY = 'WRB_L...原创 2019-11-12 20:32:49 · 271 阅读 · 0 评论 -
深入理解zend_signal
信号的安装(fast_sapi的开始在cgi_main.c)本文的文献引自<<unix高级环境编程第二版>>第十章对信号的介绍,以及unix网络编程中对SIGPIPE的介绍看到第一处令我疑惑的内容,在这里声明了一个空指针,引起了我的思考这个空指针是做什么用的呢?fcgi_request *request = NULL;于是我在fastcgi.h找到...原创 2019-11-10 09:57:15 · 458 阅读 · 0 评论 -
js事件委托
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head> <meta http-e转载 2018-05-31 09:58:53 · 165 阅读 · 0 评论 -
php扩展开发(一)自己写一个类
php扩展开发(一)自己写一个类平时自己用php写一个类包是非常容易的,直接 $zhangleiinstance = new Abelappplication();但是我们如何用c语言在php中写一个函数和类呢1.下载php源码包,然后在php的源码包目录的ext下面创建框架骨架./ext_skel --extname=helloworld2.修改config.m4##动态编译选项,通过.so的...原创 2018-06-10 15:07:40 · 5225 阅读 · 0 评论 -
php扩展开发中$_SERVER返回报错以及反思(一)
php扩展开发中$_SERVER返回报错以及反思(一)c 扩展中$_SERVER 存在到PG的http_globals中,但是我这么写却返回出错zval* result = &PG(http_globals)[TRACK_VARS_SERVER];RETURN_ZVAL(result,1,0);我从网上找有 从yaf的源代码中给出了这个解决方案 if (PG(aut...原创 2018-11-26 23:41:31 · 595 阅读 · 0 评论 -
syslog动手总结
syslog动手总结1.搭建syslog服务器1)修改配置文件 vim /etc/rsyslog.conf#去掉这一部分数据可以使rsyslog.conf创建udp套接字监听514端口#$ModLoad imudp#$UDPServerRun 514#去掉这一部分数据可以使rsyslog.conf创建tcp套接字监听514端口#$ModLoad imtcp#$InputT...原创 2018-12-14 13:38:19 · 172 阅读 · 0 评论 -
第十五章UNIX域协议
第十五章UNIX域协议15.1概述UNIX域协议并不是一个实际的协议族,而是在单个主机上执行客户和服务通讯的一种方案。unix域协议可以被视为IPC通信方式之一。UNIX域提供两类套接字:字节流套接字和数据报套接字。1)unix域套接字往往比通信两端位于同一个主机的TCP套接字快出一倍。如果服务器于客户机处于同一个主机,客户就打开服务器的unix域字节流连接,否则打开一个服务器的T...原创 2018-12-27 15:13:09 · 343 阅读 · 0 评论 -
php跨进程传递描述符
php 字节流 域套接字 跨进程传递描述符代码案例服务端:<?phpini_set("display_errors",true);//$socket = socket_create(AF_UNIX,SOCK_STREAM,0);$dir = "/root/fpm";unlink($dir);socket_bind($socket,$dir);socket_listen...原创 2018-12-27 15:27:06 · 341 阅读 · 0 评论 -
php实现大文件下载
原理:逐条查询,然后分批ob_flush输出到网页 ,当然重点还是设置http请求头,源码例子public function exportExcel() { //将超时时间设置为没有限制 set_time_limit(0); $adminID = str2int( $this->input->get('admin_...原创 2019-04-15 11:16:40 · 886 阅读 · 0 评论 -
php实现yeild实现一个简单的协程
<?phpclass Coroutine{ private $list = []; public function create($hook) { //创建一个生成器 $ge = call_user_func($hook,$this); foreach ($ge as $value) { ...原创 2019-05-06 10:34:48 · 283 阅读 · 0 评论 -
建造者模式
建造者模式概念建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的”套餐”。<...转载 2019-05-21 19:22:49 · 88 阅读 · 0 评论 -
php扩展开发(二)
php扩展开发(二)传入参数 zval *name = NULL ,*height = NULL; //参数范围是1到2个 ZEND_PARSE_PARAMETERS_START(1,2) Z_PARAM_ZVAL_DEREF(name) Z_PARAM_OPTIONAL Z_PARAM_ZVAL_DEREF(height...原创 2018-06-12 01:34:30 · 774 阅读 · 0 评论