PHP
奔跑的码农
热爱web开发,热爱生活!
展开
-
Mac升级自带PHP版本(非Homebrew方式)
一、升级到对应版本升级到PHP 7.3curl -s https://php-osx.liip.ch/install.sh | bash -s 7.3升级到PHP 7.2curl -s https://php-osx.liip.ch/install.sh | bash -s 7.2二、添加环境变量我安装的是7.3.8版本的export PATH=/usr/local/php5-7.3.8-20190811-205217/bin:$PATH三、查看PHP版本php原创 2020-05-19 14:47:58 · 1891 阅读 · 1 评论 -
PHP安装zookeeper扩展(最新基于zookeeper-3.5.8)
PHP安装zookeeper扩展一、安装依赖(已Centos为例)二、安装Cppunit测试库三、安装zookeeper-client四、安装PHP zookeeper扩展刚开始尝试pecl install zookeeper,结果发现找不到zookeeper依赖。网上的编译安装都是基于zookeeper-3.4.12.tar.gz,但是现在zookeeper稳定版本已经是apache-zookeeper-3.5.8,最新版本已经到了3.6,找不到旧的安装包了,新版安装方式有点不一样,在此分享出来给有需要原创 2020-05-19 14:37:37 · 1456 阅读 · 4 评论 -
PHP 控制反转和依赖注入(IoC/DI)
依赖注入的目的是实现松耦合的软件架构,以便更好的测试,管理和扩展的代码。控制反转(Inversion of Control):当调用者需要被调用者的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例,但在这里,创建被调用者的工作不再由调用者来完成,而是将被调用者的创建移到调用者的外部,从而反转被调用者的创建,消除了调用者对被调用者创建的控制,因此称为控制反转。依赖注入(D原创 2017-09-22 20:14:43 · 1086 阅读 · 0 评论 -
PHP中间件(middleware)解析
简介中间件是一个闭包,而且返回一个闭包。中间件为过滤进入应用的HTTP请求提供了一套便利的机制,可以分为前置中间件和后置中间件。常用于验证用户是否经过认证,添加响应头(跨域),记录请求日志等。编写规范中间件要要满足一定的规范:总是返回一个闭包,闭包中总是传入相同的参数(由主要逻辑决定), 闭包总是返回句柄(handler)的执行结果;如果中间件的逻辑在返回句柄return $handler($name)前完成,就是前置中间件,否则为后置中间件。原创 2017-09-23 11:40:48 · 9970 阅读 · 1 评论 -
PHP的内存泄漏
什么是内存泄漏内存泄漏指的是在程序运行过程中申请了内存,但是在使用完成后没有及时释放的现象, 对于普通运行时间较短的程序来说可能问题不会那么明显,但是对于长时间运行的程序, 比如Web服务器,后台进程等就比较明显了,随着系统运行占用的内存会持续上升, 可能会因为占用内存过高而崩溃,或被系统杀掉(OOM)。PHP的内存泄漏PHP属于高级语言,语言级别并没有内存的概念,在使用过原创 2017-09-30 18:17:01 · 766 阅读 · 0 评论 -
PHP并发IO编程之路
并发 IO 问题一直是服务器端编程中的技术难题,从最早的同步阻塞直接 Fork 进程,到 Worker 进程池/线程池,到现在的异步IO、协程。PHP 程序员因为有强大的 LAMP 框架,对这类底层方面的知识知之甚少,本文目的就是详细介绍 PHP 进行并发 IO 编程的各种尝试,最后再介绍 Swoole 的使用,深入浅出全面解析并发 IO 问题。多进程/多线程同步阻塞最早的服务转载 2018-01-03 15:29:15 · 1123 阅读 · 0 评论 -
PHP session锁、并发、覆盖问题解析
这篇文章主要介绍了php session的锁和并发,与之相关的现象有请求阻塞、session数据丢失、session数据读不到的问题,感兴趣的小伙伴们可以参考一下本文分享PHP的session在使用过程中的锁和并发的问题,与之相关的现象有请求阻塞、session数据丢失、session数据读不到。我登录不了了某天,我准备登录我们一个后台系统,前去解决一个bug,转载 2018-01-03 15:36:36 · 1933 阅读 · 0 评论 -
使用GDB调试PHP代码,解决PHP代码死循环
原文出处:韩天峰最近在帮同事解决Swoole Server问题时,发现有1个worker进程一直处于R的状态,而且CPU耗时非常高。初步断定是PHP代码中发生死循环。下面通过一段代码展示如何解决PHP死循环问题。#dead_loop.php$array = array();for($i = 0; $i < 10000; $i++){ $array[] = $i;转载 2018-01-03 16:20:13 · 893 阅读 · 0 评论 -
swoole的进程模型架构
swoole的强大之处就在与其进程模型的设计,既解决了异步问题,又解决了并行。主线程MainReactorswoole启动后主线程会负责监听server socket,如果有新的连接accept,主线程会评估每个Reactor线程的连接数量。将此连接分配给连接数最少的reactor线程。这样的好处是每个reactor线程持有的连接数是非常均衡的,没有单个线程负载过高的问题解转载 2018-01-03 16:22:06 · 584 阅读 · 0 评论 -
PHP程序守护进程化
一般Server程序都是运行在系统后台,这与普通的交互式命令行程序有很大的区别。glibc里有一个函数daemon。调用此函数,就可使当前进程脱离终端变成一个守护进程,具体内容参见man daemon。PHP中暂时没有此函数,当然如果你有兴趣的话,可以写一个PHP的扩展函数来实现。PHP命令行程序实现守护进程化有2种方法:一 、使用nohupnohup php myprog.转载 2018-01-03 16:37:47 · 542 阅读 · 0 评论 -
PHP 希尔排序
该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。以n=10的一个数组49, 38, 65, 97, 26, 1...原创 2018-03-21 14:25:53 · 443 阅读 · 0 评论 -
PHP7新特性总结
前言本文是一篇讲座听后+后续研究的总结。 话说当年追时髦,php7一出就给电脑立马装上了,php5和php7共存,也是立马写了个超级耗时间的循环脚本测了一番,确实php7给力很多,然后也是注意了一些新增的特性与一些丢弃掉的用法。 由于php升级乃头等大事,公司近期才打算升级,所以之前一直只能私下欣赏php7带来的快感,负责升级的小伙伴搞了个分享,还挺全的,此处mark一下,当作笔记。主要研究问题:...转载 2018-04-22 10:54:59 · 19719 阅读 · 4 评论 -
PHP5中foreach对数组指针的影响及原因
问题描述:遍历数组时,改变了数组的值,数组遍历完成后,数组的指针指向了第二个元素,当发生这种情况时,会对后续通过指针遍历数组产生影响。[php] view plain copy<? $arrD = array('0'=>'a','1'=>'b','2'=>'c'); echo key($arrD)."</br>"; foreach($arrD as $in...转载 2018-04-22 17:34:17 · 1138 阅读 · 0 评论 -
PHP---引用使用foreach(xxx as &$x)时候的坑。
注意如下一段代码:$data1 = ["1","2","3"];$data2 = ["4","5","6"];$all = 0;foreach($data1 as &$x){ $all += $x}#注意这里$x是$data1最后一个元素的引用$all2 = 0;foreach($data2 as $x=>$y){ $all2 +=原创 2018-04-22 17:54:37 · 4958 阅读 · 1 评论 -
PHP利用file_get_contents发送http请求
服务器端模拟 POST/GET 等请求,使用 CURL 很容易办到,那么如果不使用 CURL 库,又该怎么办呢?$data = array( 'test'=>'bar', 'baz'=>'boom', 'site'=>'www.nimip.com', 'name'=>'nimip.com'); $da...原创 2018-04-24 12:35:29 · 10908 阅读 · 1 评论 -
MySQL索引优化——覆盖索引
MySQL索引优化——覆盖索引最近处理老的业务代码遇到这么个例子:表结构如下:CREATE TABLE `group_user_` ( `id` int(11) NOT NULL auto_increment, `uid` int(11) NOT NULL, `username` varchar(16) NOT NULL, `gid` int(11) NOT NULL, `create_ti原创 2017-08-02 20:40:58 · 907 阅读 · 0 评论 -
PHP堆排序实现与分析
什么是最大堆堆可以视为一棵完全的二叉树,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组中的一个元素.数组与堆之间的关系:二叉堆一般分为两种:最大堆和最小堆。最大堆:堆中每个父节点的元素值都大于等于其孩子结点(如果存在);最小堆:堆中每个父节点的元素值都小于等于其孩子结点(如果存在);什么是堆排序堆排序(假设利用最大堆)就是把堆顶的最大数取原创 2017-06-02 16:25:15 · 1311 阅读 · 0 评论 -
PHP - Serializable接口详解
PHP Serializable是自定义序列化的接口。实现此接口的类将不再支持__sleep()和__wakeup(),当类的实例被序列化时将自动调用serialize方法,并且不会调用 __destruct()或有其他影响。当类的实例被反序列化时,将调用unserialize()方法,并且不执行__construct()。原创 2016-03-31 10:37:18 · 1754 阅读 · 0 评论 -
PHP - Traversable接口详解
Traversable用于检测一个类是否可以使用 foreach 进行遍历,这是一个无法在 PHP 脚本中实现的内部引擎接口,实际编程中我们使用Iterator接口或者IteratorAggregate接口来实现遍历。原创 2016-03-24 12:26:40 · 2266 阅读 · 0 评论 -
PHP - Iterator接口详解
PHP Iterator接口的作用是允许对象以自己的方式迭代内部的数据,从而使它可以被循环访问,PHP本身 已经提供了一些用于日常任务的迭代器,具体可以查看PHP手册。原创 2016-03-25 10:29:39 · 5320 阅读 · 1 评论 -
PHP Closure类详解
PHP Closure 类是用于代表匿名函数的类,匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象,这个类带有一些方法,允许在匿名函数创建后对其进行更多的控制。原创 2016-04-05 19:01:48 · 16133 阅读 · 0 评论 -
PHP - IteratorAggregate接口详解
PHP IteratorAggregate又叫聚合式迭代器,它提供了创建外部迭代器的接口,使用这些迭代器意味着只需要实现一个方法并实例化一个类就可以使对象可以迭代访问了。原创 2016-03-28 19:19:59 · 5079 阅读 · 0 评论 -
PHP SPL标准库之SplFixedArray简介
SplFixedArray与普通的PHP Array不同,它是以数字为键名的固定长度的数组,它没有使用散列(Hash)存储方式,更接近于C语言的数组,因此效率更高。原创 2016-07-11 15:51:03 · 2031 阅读 · 0 评论 -
PHP SPL标准库之SplStack简介
栈(Stack)是一种特殊的线性表,因为它只能在线性表的一端进行插入或删除元素(即进栈和出栈),SplStack继承自SplDoublyLinkedList,并且mode被限制为LIFO,即后进先出模式。原创 2016-07-11 17:20:15 · 1715 阅读 · 0 评论 -
PHP SplQueue 队列简介
队列是一种特殊的线性表,遵循先进先出原则,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。原创 2016-07-12 11:52:12 · 10464 阅读 · 0 评论 -
PHP SplHeap 堆介绍
堆(Heap)就是为了实现优先队列而设计的一种数据结构,它是通过构造二叉堆(二叉树的一种)实现。根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。二叉堆还常用于排序(堆排序)。SplHeap 是一个抽象类,实现了Iterator , Countable接口。最大堆(SplMaxHeap)和最小堆(SplMinHeap)就是继承它实现的,可以在PHP程序中直接使用。原创 2016-07-13 17:14:43 · 4068 阅读 · 3 评论 -
PHP Serializable 序列表接口
自定义序列化的接口,需要自己实现serialize和unserialize方法。实现此接口的类将不再支持 __sleep()和__wakeup()。不论何时,只要有实例需要被序列化,serialize方法都将被调用,它将不会调用 __destruct()。当数据被反序列化时,类将被感知并且调用合适的 unserialize()方法而不是调用__construct()。原创 2016-07-14 14:30:44 · 734 阅读 · 0 评论 -
PHP - Countable接口介绍
继承Countable接口的可被用于count() 函数。原创 2016-07-05 17:21:54 · 2572 阅读 · 0 评论 -
PHP实现双向链表并排序 -- 会员排名演示
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。原创 2016-07-07 18:15:22 · 2024 阅读 · 0 评论 -
PHP之双向链表(SplDoublyLinkedList)简介
PHP SPL标准库里实现了几种简单的线性表和树型结构,其中包括了双链表和双链表实现的队列和栈、最大堆、最小堆和优先队列。双链表是一种重要的线性存储结构,对于双链表中的每个节点,不仅仅存储自己的信息,还要保存前驱和后继节点的地址。双链表对PHP开发程序来讲是很重要的一种数据结构,可以把PHP数组中想想成一个双链表,而PHP内置的SplDoublyLinkedList类通过实现迭代器、数组访问和获取数量的接口使程序访问对象变得访问数组一样方便。原创 2016-07-08 17:42:17 · 6281 阅读 · 0 评论 -
PHP 冒泡排序
作为一个初级phper,平时用到的算法很少,但是基本的几种算法还是要掌握的,比如冒泡排序。需求:分别用冒泡排序法将下面数组中的值按照从小到的顺序进行排序。 要排序的数组:$arr(1,34,555,63,21,66,32,78,36,76,25);思路分析:法如其名,就是像冒泡一样,每次从数组当中冒一个最大的数出来。 比如: * 2,4,1 // 第一次 冒出的泡是4原创 2017-01-20 11:10:40 · 335 阅读 · 0 评论 -
PHP - ArrayAccess接口详解
PHP ArrayAccess接口又叫数组式访问接口,该接口的作用是提供像访问数组一样访问对象的能力,常用于实现依赖注入容器。原创 2016-03-30 14:26:11 · 2811 阅读 · 0 评论