php
文章平均质量分 68
ball球
这个作者很懒,什么都没留下…
展开
-
redis stream中pending数据的处理
1. pending数据的产生在消费者组模式下,当一个消息被消费者取出,为了解决组内消息读取但处理期间消费者崩溃带来的消息丢失问题,STREAM 设计了 Pending 列表,用于记录读(XREADGROUP)取但并未处理完毕(未ACK)的消息。2. 对pending数据的几种处理方式下面的讨论基于几点:面向的场景为多个无差别消费者(每个消费者名子相同,功能相同)在同一group下消费任务。我们要保证的是,每个任务至多只做一次。代码实现是在使用redis stream实现队列服务一文的封装基础原创 2020-11-12 14:39:19 · 4479 阅读 · 0 评论 -
使用redis stream实现队列服务
1. stream类型Redis5.0引入了Stream类型。该Stream类型的出现,几乎满足了消息队列具备的全部内容,包括但不限于:消息ID的序列化生成消息遍历消息的阻塞和非阻塞读取消息的分组消费未完成消息的处理关于stream的具体介绍可以参见:Introduction to Redis StreamsStream 类型2. 队列接口简介我们基于redis stream实现了一个基础的,类似beanstalk的队列服务。用于多个无差别的消费者从一个队列消费任务的情况。如果原创 2020-11-12 09:55:37 · 1057 阅读 · 0 评论 -
php7数组的实现及部分源码分析
1.基本概念1.1 数组的语义本质上PHP数组是一个有序字典,它必须同时满足以下2个条件:语义一:PHP数组是一个字典,存储着键-值(key-value)对。通过键可以快速地找到对应的值,键可以是整型,也可以是字符串。语义二:PHP数组是有序的。这个有序指的是插入顺序,即遍历数组的时候,遍历元素的顺序应该和插入顺序一致,而不像普通字典一样是随机的。1.2 数组的概念PHP的数组zend_array对应的是HashTable。HashTable(哈希表)是一种通过某种哈希函数将特定的键映射到特原创 2020-09-28 12:31:35 · 759 阅读 · 5 评论 -
php7 写时复制
1. 什么是写时复制在《php7引用计数》的文章中,我们知道,对于复制类型的变量,在赋值时,我们并没有重新复制一份数据,而是让新变量的zend_value中相应的指针指向原来的数据,同时增加引用计数。赋值后,如果其中一个变量试图改变数据内容,就需要重新拷贝一份原数据,同时断开zend_value指向,并改变引用计数。这个过程我们称为写时复制。下面来看一个例子:$a = range(0,2);$b = $a;xdebug_debug_zval('a');xdebug_debug_zval('b'原创 2020-09-01 18:30:46 · 227 阅读 · 0 评论 -
php7引用计数
1. 什么是引用计数在《php7 zval及变量存储方式》的2.3节中我们说到,对于复杂类型的变量(string,array,object,resource等),我们会将其具体的值记录在单独的内存区域,再由zend_value中相应的指针指向该内存区域。指向该内存区域的指针数量,即为引用计数。引用计数是服务于垃圾回收的机制的。当引用计数为0,相应的内存区域就可以回收了。官方手册中有关于引用计数的阐述,不过应该是针对5.*版本的,和7.*相比,大体思想是一样的,但实现和使用xdebug_debug_zv原创 2020-08-28 16:00:51 · 592 阅读 · 2 评论 -
php7的zval及变量存储方式
Zval是PHP中最重要的数据结构之一,它包含了PHP中变量的值和类型相关信息。1. zval1.1 zval的结构(zend_types.h)typedef struct _zval_struct zval;struct _zval_struct { zend_value value; /* value */ union { struct { ZEND_ENDIAN_LOHI_4(原创 2020-08-20 10:15:23 · 629 阅读 · 0 评论 -
php7.4 preload(预加载)
1. 什么是preload什么是preload?Preloading in PHP 7.4中有一句话总结的简单到位:Opcache, but more!那么preload比opcache多做了哪些呢?为了更好的说明问题,我们先来看下面这张opcache的工作原理图。图中不难看出,对于执行过的代码,再次执行时将命中cache,cache中的opcode可以直接被取出,进而执行。从而省了下...原创 2019-12-12 10:12:14 · 2627 阅读 · 0 评论 -
php中self与static的区别
原文链接,猛击这里。php中self与static的区别通过一些示例,我们可以很容易看出self和static的区别。假定我们有class Car – 它有两个方法,model和getModel。注意,这里我们使用了关键字self。class Car{ public static function model() { self::getModel(); }翻译 2017-08-18 14:26:34 · 10389 阅读 · 0 评论 -
使用tideways绘制php callgraph(profiling)
零. 概述tideways是一款付费的在线应用,其诸多强大功能可见这里。 你可以在官网上注册,并免费使用一个月。如果想继续使用,又不想付费怎么办?答:换个邮箱!本文主要讲述如何用tideways绘制php callgraph(profiling)。 从callgraph上,你可以很清楚的看到: - php函数调用关系 - 每步执行时间 - 函数执行次数并依此对代码进行优化。相比于xdebu原创 2017-11-10 14:44:54 · 2039 阅读 · 0 评论 -
不重新编译PHP,单独添加扩展模块的方法
问题php自身提供了很多扩展,比如curl,gmp, mbstring等等。我们在编译安装php时未必安装了所有扩展。那么在安装完php后,如果想单独安装某个php自身的扩展怎么办呢?我们以curl扩展模块的安装为例说明如何单独添加扩展。步骤1.进入php源码的扩展目录。本例中我的源码对应目录如下:/search/src/php-7.0.14/ext2.进入模块目录,我们安装的是curl扩展,所以进原创 2018-01-09 18:10:31 · 8973 阅读 · 0 评论 -
ab发送cookie和post请求的方法
ab是apache自带的压力测试工具,近期需要压测一个接口,涉及使用post请求,并在其中带cookie。方法总结如下:1. 发送cookie方法1-C key1=value1;key2=value2...例:ab -n 1 -C "name=ball;age=99;sex=male" "http://wc.sogou.com/worldcup2018/test...原创 2018-05-30 17:49:24 · 5955 阅读 · 0 评论 -
php setcookie对cookie值进行urlencode的问题及解决
1. 问题有如下代码setcookie.phpclass Cookie{ protected $_key = "person"; protected $_val = "name:ball,sex:male"; public function set(){ $duration = 0; $path = "/";原创 2018-10-25 18:58:56 · 2491 阅读 · 1 评论 -
使用curl控制下载速度
1. 速度控制1.1 php代码方式function http_request($URI){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $URI); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //速度控制 $speed = 100...原创 2018-12-05 17:11:45 · 8831 阅读 · 0 评论 -
post提交数据的常见方式及php对应的接收方法
post提交数据的方式,主要体现在http协议头上的Content-Type字段,不同的Content-Type对应不同的http请求体,与之相应的php接收数据方法也不同。1.application/x-www-form-urlencoded1.1发送html中的form表单,如果不设置enctype属性,就默认用该方式提交数据。发送的http请求类似:POST http://exam...原创 2019-02-21 18:34:47 · 3863 阅读 · 0 评论 -
php中array_merge与array相加的区别
一.array_merge1. 数组键值为字串的情况(hash数组)键名相同的情况下,后出现的元素覆盖先出现的。示例<?php$ary1 = array('name'=>'test', 'age'=>18);$ary2 = array('age'=>3, 'sex' => 'm');$result = array_merge($ary1, $ary2);var_dump($result);输原创 2017-06-13 11:43:25 · 1726 阅读 · 0 评论 -
使用phpredis批量向sort set中加入元素
问题zAdd, 按文档所述,可以向sort set中加入一个或多个元素。加入多个元素的方式如下:$redis->zAdd('key', score1, 'val1', score2, 'val2', ...);这种api的形式在实际使用中非常的不方便,特别是要批量加入元素时。解决个人觉得,方便的api形式应该接受kv形式的元素数组,数组的每项是val=>score。 代码如下:/* * 批量向s原创 2017-03-25 11:40:07 · 5111 阅读 · 0 评论 -
使用strace跟踪多进程程序
简介strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。常用参数-p 跟踪指定的进程-o filename 默认strace将结果输出到stdout。通过-o可以将输出写入到filename文件中-ff 常与-o选项一起使用,不同进程(子进程)产生的系统调用输出到filename.PID文件-r 打印每一个系统调用的相对时间-t 在输出中的每一行前加上时间信息。原创 2017-02-14 15:38:29 · 4776 阅读 · 0 评论 -
php上传文件详解
上传文件功能由两个部分组成,HTML页面和PHP处理部分。HTML页面主要是让用户选择所要上传的文件,php部分让我们可以把文件存储到服务器的指定目录。一.HTML部分upload.html 上传Demo:原创 2012-08-08 09:41:32 · 10439 阅读 · 3 评论 -
curl抓取页面时遇到重定向的解决方法
用php的curl抓取网页遇到了问题,为阐述方便,将代码简化如下:<?phpfunction curlGet($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);原创 2012-09-03 13:29:39 · 60737 阅读 · 6 评论 -
php时区问题
新装了php,用date("Y-m-d H:i:s");得出的时间比实际少了8小时。显然,这是时区的问题,如何调整呢?方法一在php.ini文件中修改设置找到date.timezone项,修改其设置date.timezone = Asia/Shanghai通过cgi方式运行php的话,记得重启apache配置才会生效。方法二如果有权限等问题,可以在PHP原创 2012-10-06 20:21:00 · 1153 阅读 · 0 评论 -
PHP中的替代语法(冒号、endif、endwhile、endfor)
我们经常在wordpress一类博客程序的模板里面看到很多奇怪的PHP语法,比如: 空的对于相当一部分PHP爱好者来说根本没见过,这些是什么东西呢?其实这些都是PHP流程控制的替代语法,只不过不常用而已。下面就就给大家详细说一下PHP流程控制的替代语法。1.什么是替代语法?简单的说就是一些语法的另类写法。2.PHP中有哪些语法有替代语法?if,while,f转载 2012-10-07 09:48:10 · 29890 阅读 · 1 评论 -
从一个bug谈rtrim
今天遇到一个bug,代码很简单:<?php$src = '战争片';$result = rtrim($src, '片');echo mb_convert_encoding($result, 'gbk', 'utf-8'),"\n";本来以为得到的结果会是“战争”,但实际输出的却只有“战”。不明所以,以为是rtrim的问题。查了一下,原来是自己对rtrim的理解有误。rtrim原创 2012-09-17 15:27:51 · 1217 阅读 · 0 评论 -
yii外部action中如何渲染页面
yii的controller中支持调用外部的action类(见《在controller中使用外部的action》)但最近工作时碰到这样一个问题,外部action类如何渲染页面(render)呢?假设有如下action类<?phpclass WorktimeAction extends CAction { public function run(){ //数原创 2012-10-17 17:29:22 · 3469 阅读 · 0 评论 -
smarty3 include file中使用block产生的bug及解决方式
问题smarty3的一个很重要,也是很方便的特性是模板继承。今天碰到了一个模板继承相关的题,记录一下。原码有点多,所以将问题代码抽象如下:tpl.parent.htm:{block name="body"} parent body {/block} {include file="tpl.parentFooter.htm"}tpl.parentFooter.htm:{b原创 2014-03-14 10:23:02 · 2897 阅读 · 0 评论 -
使用xmllint处理/验证xml
xmllint是一个很方便的处理及验证xml的工具,linux下只要安装libxml2就可以使用这个命令,下面整理一些常用功能1. --format此参数用于格式化xml,使其具有良好的可读性。假设有xml(person.xml)内容如下:ball30male执行:xmllint --format person.xml得到易读的xml ball 30 ma原创 2013-05-21 15:21:29 · 25607 阅读 · 2 评论 -
apc和apcu
apcapc(alternative php cache) apc的功能分为两部分 1. opcode缓存 2. 数据缓存,可以存储k/v对,类似memcacheapc的问题在php5.3.* 之后的版本自带php_opcache,不再需要apc的opcode缓存功能apc的3.1.14版本在php5.5版本上有严重的内存问题,被官方废弃。最新可用的apc版本为3.1.13,仅支持php原创 2016-07-26 17:42:33 · 7564 阅读 · 0 评论 -
smarty的block function(块函数)
什么是block function如果你使用过smarty3,一定对下面的代码不陌生。{block}...{/block}block function的形式同上面类似。{func}...{/func}它用标签圈起一个块,然后对这个块的内容进行操作。如何定义block functionsmarty_block_name($params, $content, $template, &$repeat);这原创 2016-08-16 16:58:27 · 2734 阅读 · 0 评论 -
从微信自定义菜单说php json_encode不转义中文汉字的方法
最近在开发微信自定义菜单。接口比较简单,就是按微信要求的格式post一段json数据过去就成。但我的菜单中里有中文,json_encode后出现了类似"\u5c0f\u8c61" 的unicode字符。请求发出后被微信接口告知:{"errcode":40033,"errmsg":"invalid charset. please check your request, if incl原创 2015-05-13 10:38:48 · 17277 阅读 · 4 评论 -
smarty的replace陷阱
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl原创 2016-09-28 11:03:01 · 3246 阅读 · 0 评论 -
关于php匿名函数中的use
匿名函数中的use,其作用就是从父作用域继承变量。 下例是最常见的用法,如果不使用use,函数中将找不到变量$msg。<?php$msg = [1,2,3];$func = function()use($msg){ print_r($msg);}; $func();?>运行输出Array( [0] => 1 [1] => 2 [2] => 3)关于继原创 2016-12-15 11:33:35 · 10614 阅读 · 0 评论 -
与文件上传有关的php配置参数
搞个了图片上传,死活不好使,后来发现是php参数配置的问题。下面总结下与文件上传有关的php参数,备忘之~所有这些参数都在php.ini中设置。1.file_uploads设为On,允许通过HTTP上传文件2.upload_tmp_dir文件上传至服务器时用于临时存储的目录,如果没指定,系统会使用默认的临时文件夹(我的机器是/tmp)。3.upload_max_file原创 2012-08-06 15:28:06 · 2735 阅读 · 0 评论