PHP
代码一天不写我浑森蓝廋
防民之口,甚于防川。川壅而溃,伤人必多,民亦如之。
展开
-
纯PHP实现的websocket客户端
websocket协议RFC文档地址:https://tools.ietf.org/html/rfc6455,以下是用纯PHP实现的一个轻量的websocket客户端,可以用来与websocket服务器进行通信。<?phpnamespace library\util;use Exception;class BadUriException extends Exception{}class ServerConnectException extends Exception{}cl.原创 2020-06-20 16:33:49 · 8189 阅读 · 6 评论 -
php+kafka安装
1、 安装java,并设置相关的环境变量> wget https://download.java.net/openjdk/jdk7u75/ri/openjdk-7u75-b13-linux-x64-18_dec_2014.tar.gz> tar zxvf openjdk-7u75-b13-linux-x64-18_dec_2014.tar.gz> mv java-se-...原创 2019-12-31 12:47:38 · 1019 阅读 · 0 评论 -
中国上市互联网公司市值排名
排名 公司 市值(单位:亿美元) 1 阿里巴巴 4594.26 2 腾讯 3992.62 3 美团 728.56 4 拼多多 482.26 5 京东 459.40 6 网易 370.50 7 百度 364.71 8 好未来 252.97 9 腾讯音乐...原创 2019-11-05 11:48:27 · 28552 阅读 · 0 评论 -
PHP重置数组为连续数字索引的几种方式
比如这样的一个php数组:$arr = array( 1 => 'apple', 3 => 'banana', 5 => 'orange');想要转换为这样的数组:$arr = array( 0 => 'apple', 1 => 'banana', 2 => 'orange');1、推荐的方式 array_values 方法原创 2017-11-22 19:07:49 · 45340 阅读 · 1 评论 -
PHP7打开Opcache,优化PHP7性能的几个设置
PHP7已经发布了, 作为PHP10年来最大的版本升级, 最大的性能升级, PHP7在多放的测试中都表现出很明显的性能提升, 然而, 为了让它能发挥出最大的性能, 我还是有几件事想提醒下.PHP7 VS PHP5.61. Opcache记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快, 所以之前转载 2017-10-30 16:03:24 · 21426 阅读 · 0 评论 -
PHP实现系统编程(一) --- 网络Socket及IO多路复用
一直以来,PHP很少用于socket编程,毕竟是一门脚本语言,效率会成为很大的瓶颈,但是不能说PHP就无法用于socket编程,也不能说PHP的socket编程性能就有多么的低,例如知名的一款PHP socket框架workerman就是用纯PHP开发,并且号称拥有优秀的性能,所以在某些环境下,PHP socket编程或许也可一展身手。PHP提供了一系列类似C语言socket库中的方法供我们调原创 2017-08-18 17:24:38 · 11164 阅读 · 5 评论 -
PHP实现系统编程(四)--- 本地套接字(Unix Domain Socket)
Socket一开始是为了解决网络通信而出现的技术,而后来有发展出一种成为本地套接字的技术,本地套接字顾名思义,只支持本地的两个进程之间进行通信,虽然网络套接字也可以通过本地回环地址(127.0.0.1)来达到本地进程通信,但由于本地套接字省去了网络协议,拆封包等操作,所以效率上相比网络套接字有一定的优势。原创 2017-09-30 16:18:14 · 4408 阅读 · 2 评论 -
详解composer的自动加载机制
composer是一个用PHP开发的用来管理项目依赖的工具,当你在项目中声明了依赖关系后,composer可以自动帮你下载和安装这些依赖库,并实现自动加载代码。安装composercomposer的安装非常的容易1.下载安装脚本,这里把安装脚本保存为 composer-setup.php[root@localhost composer]# php -r "copy('https://install...原创 2017-09-27 23:10:21 · 14150 阅读 · 2 评论 -
PHP7的异常处理机制,set_error_handler和set_exception_handler方法介绍
由于历史原因,php一开始被设计为一门面向过程的语言,所以异常处理没有使用像Java一样的try/catch机制,出错时直接显示到页面上,或者记录到web服务器的错误日志中,并且php的错误分成了很多的级别,例如E_ERROR、E_WARNING、E_PARSE、E_NOTICE等等,对于像E_ERROR、E_PARSE这样的严重错误,php会直接终止脚本的运行。虽然对于php5版本,我们可以原创 2017-07-14 16:11:15 · 16327 阅读 · 2 评论 -
PHP实现系统编程(二) --- 多进程编程介绍及孤儿进程、僵尸进程
多进程编程也是系统编程的一个重要方面,但PHP程序员通常不需要关心多进程的问题,因为web服务器或者PHP-FPM已经帮我们管理好进程方面的问题了,但是如果我们想要用PHP来开发CLI程序,多进程编程是不可或缺的基本技术。PHP中关于进程控制的方法主要使用到PCNTL(Process Control)扩展, 所以,在进行多进程编程之前,首先要确保你的PHP已经安装了最新的PCNTL扩展,可以输原创 2017-08-22 14:41:42 · 891 阅读 · 0 评论 -
使用原生PHP编写Redis扩展(客户端)介绍
Redis是典型的C/S架构软件,Client 和 Server 之间通过TCP连接进行通信,所以原则上只要是支持socket编程的语言都可以用来编写Redis的客户端,PHP自然也不例外,只是一般我们习惯上或出于性能考虑,使用C编写的Redis扩展。PHP可以使用简单易用的 stream_socket_* 族函数来进行socket编程比如连接Redis服务器(假设为12原创 2017-12-07 17:22:54 · 2960 阅读 · 1 评论 -
PHP实现系统编程(五)--- 编写守护进程详解
(一)进程组、会话、控制终端、控制进程等概念进程组:每个进程都有一个所属的进程组 (process group),进程组有一个进程组长(process group leader),进程组ID即为这个进程组长的进程号,所以判断一个进程是否为进程组组长,只需比较该进称号是否和它的进程组id相等即可,PHP中可以用函数 posix_getpgrp() 获取当前进程的进程组id,用 posix_get原创 2018-01-30 18:12:20 · 1319 阅读 · 0 评论 -
php两种实现守护进程的方式。
第一种方式,借助 nohup 和 & 配合使用。在命令后面加上 & 符号, 可以让启动的进程转到后台运行,而不占用控制台,控制台还可以再运行其他命令,这里我使用一个while死循环来做演示,代码如下<?phpwhile(true){ echo time().PHP_EOL; sleep(3);}用 & 方式来启动该进程[ro原创 2016-08-18 12:56:51 · 22254 阅读 · 0 评论 -
PHP统计UTF-8编码文件中的字符数
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,由Ken Thompson于1992年创建,现在已经标准化为RFC 3629。UTF-8用1到4个字节编码Unicode字符。那如何判断一个字符到底是用几个字节表示的呢,这个从一个UTF-8字符的首字节中就可以判断,UTF-8编码规则:如果只有一个字节则其最高二进制位...原创 2019-08-12 21:29:57 · 799 阅读 · 0 评论 -
PHP中include和require区别
最近面试中被问到include和require区别,现在总结一下。先上官方手册镇楼:然后再对网上的各种谣言一一论证。谣言一:include有返回值,而require没有验证代码:<?php$res1 = require 'foo1.php';$res2 = include 'foo2.php';var_dump($res1, $res2);执...原创 2019-08-05 13:17:29 · 728 阅读 · 0 评论 -
php使用redis来实现限流和并发控制
在一些瞬时可能会有大量并发请求同时到达服务器的场景下,比如抢购、限时活动等等,如果不对并发量进行控制,瞬时的高并发可能会导致系统崩溃,这时我们就需要把一部分请求挡掉,可以结合redis来实现一个基本的限流功能。function makeOrder(\Redis $redis, $concurrencyKey) { try { if ($redis->incr($con...原创 2019-07-03 12:34:35 · 2616 阅读 · 3 评论 -
PDO的ATTR_ERRMODE属性介绍
PDO可以通过设置ATTR_ERRODE属性来控制sql执行出错时的行为表现,具体可以设置以下三个值:PDO::ERRMODE_SILENT 静默模式,不会报错,只会设置PDO的 errorCodePDO::ERRMODE_WARNING会报warning错误PDO::ERRMODE_EXCEPTION 抛出异常下面来看代码演示:1、静默模式...原创 2019-05-20 23:31:24 · 3255 阅读 · 0 评论 -
nginx.conf、php-fpm.conf和php.ini三者之中的error_log指令之间的区别和联系
error_log这个指令在nginx的配置文件nginx.conf、php-fpm的配置文件php-fpm.conf以及php.ini三者中都存在,本文试图简要说明下这三个配置之间的区别和联系。php.inierror_logstring设置脚本错误将被记录到的文件。该文件必须是web服务器用户可写的。如果特殊值syslog被设置,则将错误信息发送到系统日志记录器。在Unix...原创 2019-04-21 23:22:01 · 2276 阅读 · 0 评论 -
php实现crc16算法
crc(循环冗余校验)是一种常用来检验数据完整性和正确性的算法,常用于网络传输校验,压缩算法等等,简单来说,crc把一个待校验字符串当作一个非常大的整数,然后除以一个特定的数,所得的余数就是crc校验值,只不过在进行除法运算时,对二进制数加减采用模二运算,也即异或运算,详细的crc介绍请参考:https://www.lammertbies.nl/comm/info/crc-calculation....原创 2019-04-06 23:52:22 · 7241 阅读 · 9 评论 -
php向redis list一次性lPush多个值
php redis扩展没有介绍向list中一次性push多个值的用法,但其实lPush和rPush是支持push多个值的,文档中有介绍lPush- Prepend one or multiple values to a listrPush- Append one or multiple values to a list用法也很简单,看示例代码:<?php$red...原创 2019-03-28 00:19:31 · 15046 阅读 · 1 评论 -
php多进程读写同一个文件锁的问题及flock详解
php是原生支持多进程编程的,可以利用pcntl_fork()在当前位置产生一个子进程,那么就可能存在多个进程读写同一个文件的问题,比如多进程程序读写同一个日志文件,这样就有必要解决读写同一个文件时加锁的问题,php已经内置了一个读写的文件锁方法flock,,官方的解释是轻便的文件咨询锁定,这很官方。还是先看一个栗子吧:<?php$fp = fopen("logs/app.原创 2016-08-16 00:28:23 · 13823 阅读 · 2 评论 -
CI框架不写Nginx错误日志的原因分析及解决办法
在正式的生产环境中,通常我们会关闭PHP页面上的错误输出,也就是设置php.ini中的 display_errors 选项为 off,这时如果遇到程序出错我们还可以查看Nginx的错误日志error.log来得知报错原因(前提是php.ini中的 log_errors 选项设置为 on),例如这样的:2017/07/17 10:25:19 [error] 1556#868: *1 FastCG原创 2017-07-17 18:05:47 · 1257 阅读 · 0 评论 -
Redis遍历所有key的两个命令 -- KEYS 和 SCAN
当我们需要遍历Redis所有key或者指定模式的key时,首先想到的是KEYS命令:KEYS pattern官网对于KEYS命令有一个提示: KEYS 的速度非常快,例如,Redis在一个有1百万个key的数据库里面执行一次查询需要的时间是40毫秒 。但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的 KEYS, 你最好还是用 Redis 的集合原创 2017-07-07 11:20:09 · 139347 阅读 · 5 评论 -
Redis地理空间(geospatial)介绍和简单使用
在Redis最新的3.2版本中加入了地理空间(geospatial)以及索引半径查询的功能,这在需要地理位置的应用上或许可以一展身手,先来看下官网对geospatial的介绍Adds the specified geospatial items (latitude, longitude, name) to the specified key. Data is stored into t原创 2017-06-10 20:34:43 · 13256 阅读 · 2 评论 -
php判断是否是手机或移动端访问
function is_mobile(){ $useragent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; $useragent_commentsblock = preg_match('|\(.*?\)|', $useragent, $matches) > 0 ? $matches[0] :原创 2016-01-12 16:25:00 · 916 阅读 · 0 评论 -
ajax提交指定数字键名数组的方法
有时我们a在做jax请求时需要传递数组参数,并且是一些分散的特定键名,例如:index.html: var name = [];name[5] = 'aaaa';name[10] = 'bbbb';$.ajax({ url : "index.php", data : {name : name}, type : 'POST', succ原创 2016-01-29 01:20:19 · 1118 阅读 · 0 评论 -
php用isset()判断变量是否定义的存在的坑
在写php程序时,我们通常用isset()来检测变量是否定义,但其中存在一个问题,看手册上对该方法的描述:bool isset ( mixed$var [, mixed$... ] )检测变量是否设置,并且不是 NULL 。 如果已经使用 unset()释放了一个变量之后,它将不再是 isset() 。若使用isset() 测试一个被设置成 NULL的变原创 2015-12-19 19:15:55 · 5002 阅读 · 0 评论 -
PHPExcel冻结(锁定)表头的使用方法
PHPExcel是一款功能比较强大的操作微软excel的PHP插件,在导出数据时为了方便查看,有时需要锁定表头,也就是在滚动查看数据时,表头始终出现在视野中,而不会消失。调用方法如下:$objPHPExcel = new PHPExcel();$objPHPExcel->setActiveSheetIndex(0);$objPHPExcel->getActiveSheet()->fre原创 2015-12-19 13:01:37 · 11638 阅读 · 0 评论 -
php接收表单中有大数组存在时的问题
最近在做项目时,表单中提交了一个超大的数组(数组元素的个数超过1000),结果数组数据总是会有丢失,最后百度了下,看到了高人的解答,原来从php5.3之后,php为了安全性,限制了表单提交字段的数量,也就是php.ini配置文件中 max_input_vars参数 ,默认的值为1000,,超过1000表单数据会被自动丢掉。鉴于这个原因,推荐大家在提交大数组时,可以在前端把数原创 2016-01-18 15:16:57 · 871 阅读 · 0 评论 -
php获取当前工作目录的方法getcwd
php可以使用魔术常量__FILE__来获取当前文件的绝对路径,而不管当前的文件是否是被其他文件包含的,这在很多情况下是非常有用的,但有时当我们进行读写文件之类的操作时,相对的是当前脚本的工作目录,也就是入口php文件的目录,此时可以采用php提供的另一个函数 getcwd()来获取比较两者的差别:<?php if (!defined('BASEPATH')) exit('No d原创 2015-11-10 16:04:20 · 7298 阅读 · 0 评论 -
centos7 yum install php php-fpm
首先安装epel:yum -y install epel然后安装php php-fpm:yum -y install php php-fpm这样就安装好了php和php-fpm,是不是非常的简单原创 2015-12-20 21:14:43 · 2733 阅读 · 0 评论 -
PHP中数字千分位逗号分隔函数number_format()
number_format摘自PHP官方文档(PHP 4, PHP 5)number_format — 以千位分隔符方式格式化一个数字 说明string number_format ( float$number [, int$decimals = 0 ] )string number_format ( float$number , int原创 2015-10-08 18:32:57 · 13930 阅读 · 0 评论 -
php另类判断是否是闰年以及获取本年天数的方法
//根据年份判断是否是闰年function is_leap_year($year){ $days = date('z' , mktime(23,59,59,12,31,$year)) + 1; return $days == 366;}//根据年份获取当年的天数function get_total_days($year){ return date("z" , mktime(23原创 2015-10-13 17:08:14 · 2117 阅读 · 0 评论 -
利用百度API获取当前用户的省市地区,适合定位精度要求不高的项目
代码如下:function getDistrict(){ $ch = curl_init(); curl_setopt($ch , CURLOPT_URL , 'http://api.map.baidu.com/location/ip?ak=qxVuv98bZnwXqMU3fmmxXSoF&ip=&coor=bd09ll'); curl_setopt($ch , CURLOPT_RET原创 2015-11-24 21:20:59 · 5142 阅读 · 0 评论 -
利用jquery插件jquery.form.js异步上传图片
jquery.form.js是一款用于异步提交表单的插件,使用起来非常的方便,当然也可以用来异步上传图片,有些场合可以用来替代uploadify等flash插件,非常的轻量级。使用方法: Name: Comment: $(function(){ $('#myForm').ajax原创 2016-02-16 00:24:12 · 800 阅读 · 0 评论 -
全国各省市名称和代号
php代码:$district = array ( 0 => array ( 'province' => array ( 'code' => 10101000, 'name' => '广东', ), 'city' => array ( 0 => array ( 'code'原创 2016-03-10 16:36:15 · 13607 阅读 · 0 评论 -
Redis中lua脚本使用
Redis从2.6版本开始内置了一个lua脚本解释器,这让Redis在一定程度上成为一门可编程的数据库,如同Oracle的pl/sql,下面简单介绍下该特性Redis执行lua脚本主要依靠两个命令:EVAL和EVALSHAEVAL 和 EVALSHA 命令是从 Redis 2.6.0 版本开始的,使用内置的 Lua 解释器,可以执行 Lua 脚本。EVAL原创 2017-06-12 15:40:55 · 1356 阅读 · 0 评论 -
redis中HyperLogLogs使用介绍
A HyperLogLog is a probabilistic data structure used in order to count unique things (technically this is referred to estimating the cardinality of a set). Usually counting unique items requires usi翻译 2017-06-06 16:12:05 · 5104 阅读 · 0 评论 -
php上下文(Context)介绍
php中的上下文能够用于各种文件流和数据流,能让使用者对数据的获取达到个性化的需求和更精细的控制。举例来说,当我们想要抓取一个页面内容时,最简单直接就是是用file_get_contents方法$html = file_get_contents('http://blog.csdn.net'); //抓取csdn博客首页这样只局限用get方式访问,如果是post方式抓取页面貌似就办原创 2017-06-09 17:18:22 · 3410 阅读 · 0 评论 -
PHP如何知道一个类中所有的方法
当我们使用一个类时既没有源码也没有文档时(尤其是php扩展提供的类,比如mysqli,Redis类),我们该怎么知道这个类中提供了哪些方法,以及每个方法该怎么使用呢,此时就该PHP中强大的反射登场了,下面以Redis扩展为例用代码演示:<?php$ref = new ReflectionClass('Redis');$consts = $ref->getConstants(); //返原创 2017-06-08 19:54:14 · 4517 阅读 · 0 评论