![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
PHP
lcli
这个作者很懒,什么都没留下…
展开
-
Phystrix介绍
About Phystrix在具有PHP前端的分布式系统中,应用程序与许多远程服务进行通信。无论是您自己的一组服务,第三方RESTful API还是需要网络交互的传统组件:在复杂的高负载系统中,偶尔的故障是无法避免的。Phystrix通过跟踪各种指标并防止重复性故障来保护对远程资源的访问点。如果服务失败的情况太频繁,为了不使情况更糟,Phystrix将暂时停止向它发出请求。当服务恢复生机时,P...翻译 2019-03-23 18:02:12 · 745 阅读 · 0 评论 -
基于swoole实现多进程处理耗时任务
swoole提供了创建进程的简便方式,同时如果有进程池的需求,也是可以快速上手,因公司swoole较老,swoole原生提供的进程池不能使用,这里就用swoole_process实现了多进程处理耗时任务的需求。这次的背景是这样的,有个每分钟1次的定时任务,这个定时任务启动后,会循环请求多个agent上的数据,最初的实现是通过for循环去请求各个agent的数据进行处理,这种模式有个固有缺陷,即...原创 2019-02-23 13:08:09 · 3095 阅读 · 2 评论 -
PHP基于文件锁实现sqlite的并发操作
sqlite简单好用,但是不支持多个进程的并行操作,即使并行的读也不行,出现并行读取,会出现database is locked错误。如果多个进程操作同个sqlite库,通过随机重试可以规避掉一些并行的操作,但是在并发量大的情况下,还是不能完全规避掉并行的操作导致的失败。完美的解决sqlite的并行操作,还得依靠锁机制,目前锁的实现有多钟方式,可以通过文件锁的方式实现,当然分布式锁也可以用...原创 2019-02-23 11:57:23 · 1195 阅读 · 0 评论 -
PHP使用Sqlite3批量插入调优
工作中用到SQLite,简单好用,但是存在多个进程写同一个db文件时的锁问题,报database is locked错误导致插入失败。业务中存在批量插入的场景,这里按之前MySQL的优化思路优化了SQLite的插入,下面是一些测试用例。下面的测试用列是在我虚拟机上执行的,绝对数据没什么意义,可以对比看各个方案的执行效率。<?phpclass TestSqlite { ...原创 2018-12-09 20:20:18 · 973 阅读 · 1 评论 -
Yii源码解析之PgsqlMutex
基于PSSQL实现的数据库锁,其源码如下:<?php/** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */namespace yii\mutex;...原创 2018-11-19 22:24:58 · 182 阅读 · 0 评论 -
Yii源码解析之OracleMutex
基于Oracle实现的数据库加锁,其源码如下:<?php/** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */namespace yii\mutex...原创 2018-11-19 22:22:47 · 116 阅读 · 0 评论 -
Yii源码解析之MysqlMutex
基于Mysql实现的锁,其原理是利用了mysql提供的API,即:select get_lock(key, timeout) from ***; select release_lock(key) from ***;其中***为要加锁的KEY。class MysqlMutex extends DbMutex{ /** * Initializes MySQL s...原创 2018-11-19 22:19:12 · 296 阅读 · 0 评论 -
Yii源码解析之DbMutex
Yii提供了基于DB的加锁机制,其基类为DbMutex。其源码如下:abstract class DbMutex extends Mutex{ /** * @var Connection|array|string the DB connection object or the application component ID of the DB connection....原创 2018-11-19 22:11:33 · 178 阅读 · 0 评论 -
Yii源码解析之FileMutex
FileMutex通过本地文件系统文件实现互斥锁“锁定”机制。该组件依赖于PHP flock()函数。应用配置示例:[ 'components' => [ 'mutex' => [ 'class' => 'yii\mutex\FileMutex' ], ],]注意1:此组件只能为单个Web服...原创 2018-11-19 21:58:47 · 369 阅读 · 0 评论 -
Yii源码解析之Mutex
Mutex组件允许并发进程的相互执行,以防止“竞争条件”。这是通过使用“锁定”机制实现的。每个可能并发的线程通过在访问相应数据之前获取锁来进行协作。用法示例:if ($mutex->acquire($mutexName)) { // business logic execution} else { // execution is blocked!}这是一个基...原创 2018-11-19 21:35:23 · 902 阅读 · 0 评论 -
Yii源码分析之DbCache
DbCache通过将缓存数据存储在数据库中来实现缓存应用程序组件。默认情况下,DbCache将会话数据存储在名为“cache”的数据库表中。必须预先创建此表。可以通过设置$ cacheTable来更改表名有关DbCache支持的常见缓存操作,请参阅yii \ caching \ Cache。以下示例显示如何配置应用程序以使用DbCache:'cache' => [ ...原创 2018-11-20 23:48:46 · 484 阅读 · 0 评论 -
Yii源码分析之ZendDataCache
ZendDataCache根据应用程序组件提供Zend数据缓存。要使用此应用程序组件,必须加载Zend Data Cache PHP扩展。有关ZendDataCache支持的常见缓存操作,请参阅yii \ caching \ Cache。我们看下其源码: <?php/** * @link http://www.yiiframework.com/ * @copyrig...原创 2018-11-20 23:44:33 · 248 阅读 · 0 评论 -
Yii源码分析之XCache
XCache根据应用程序组件提供XCache缓存。要使用此应用程序组件,必须加载XCache PHP扩展。另请注意,只有在php.ini中将“xcache.admin.enable_auth”设置为“Off”时,flush()功能才能正常工作。有关XCache支持的常见缓存操作,请参阅yii \ caching \ Cache。其源码分析如下:<?php/** * @l...原创 2018-11-20 23:37:38 · 156 阅读 · 0 评论 -
Yii源码分析之WinCache
WinCache根据应用程序组件提供Windows缓存缓存。要使用此应用程序组件,必须加载WinCache PHP扩展。另请注意,php.ini文件中的“wincache.ucenabled”应设置为“On”。有关WinCache支持的常见缓存操作,请参阅yii \ caching \ Cache手册。其源码分析如下:<?php/** * @link http://ww...原创 2018-11-20 23:35:56 · 179 阅读 · 0 评论 -
Yii源码分析之FileCache
FileCache使用文件实现缓存组件。对于要缓存的每个数据值,FileCache会将其存储在单独的文件中。缓存文件位于$ cachePath下。 FileCache将自动执行垃圾收集以删除过期的缓存文件。有关FileCache支持的常见缓存操作,请参阅yii \ caching \ Cache。其源码如下:<?php/** * @link http://www.yii...原创 2018-11-20 23:32:17 · 514 阅读 · 0 评论 -
Yii源码分析之DummyCache
DummyCache是一个占位符缓存组件。DummyCache不会缓存任何内容。提供它是为了总是可以配置'缓存'应用程序组件并保存对\ Yii :: $ app-> cache的存在的检查。通过将DummyCache替换为其他缓存组件,可以快速从非缓存模式切换到缓存模式。我们看下其源码:<?php/** * @link http://www.yiiframewor...原创 2018-11-20 23:28:48 · 574 阅读 · 0 评论 -
Yii源码分析之ArrayCache
ArrayCache仅通过将值存储在数组中来为当前请求提供缓存。有关ArrayCache支持的常见缓存操作,请参阅yii \ caching \ Cache。与yii \ caching \ Cache不同,ArrayCache允许set(),add(),multiSet()和multiAdd()的expire参数为浮点数,因此您可以指定以毫秒为单位的时间(例如,0.1将为100)毫秒)。...原创 2018-11-20 23:23:43 · 268 阅读 · 0 评论 -
Yii源码分析之ApcCache
ApcCache根据应用程序组件提供APC缓存。要使用此应用程序组件,必须加载APC PHP扩展。或者,可以通过将useApcu设置为true来使用APCu PHP扩展。要为CLI启用APC或APCu,您应该在php.ini中添加“apc.enable_cli = 1”。有关ApcCache支持的常见缓存操作,请参阅yii \ caching \ Cache。我们看下其源码:&l...原创 2018-11-20 23:21:28 · 519 阅读 · 0 评论 -
利用swoole多进程压测服务框架dubbo-php-framework
因工作需要,近期对dubbo-php-framework进行了压测,重点是看dubbo-php-framework本身的性能,故直接在本地虚拟机上做了压测,provider和consumer都是同台虚拟机上执行。测试的场景为1k字符串的原样返回,即发1k字符串请求到provider,provider不做处理,原样返回。测试代码如下:$s = new ProcessPool();$s...原创 2019-03-01 20:15:32 · 484 阅读 · 0 评论 -
php多进程消费kafka消息封装公共类
php操作kafka,需要安装rdkafka扩展,具体安装手册在网络自行查找。下面代码是低阶和高阶的操作公共类库。abstract class KafkaConsumerBaseService{ protected $topic; protected $brokers; protected $worker_process_num = 0; private...原创 2019-03-06 14:33:58 · 1020 阅读 · 1 评论 -
程序员面试算法搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例2:输入: [1,3,5,6], 2输出: 1示例 3:输入: [1,3,5,6], 7输出: 4示例 4:输入: [1,3,5,6], ...原创 2019-03-16 21:48:13 · 230 阅读 · 0 评论 -
程序员面试算法回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文...原创 2019-03-16 19:28:28 · 195 阅读 · 0 评论 -
程序员面试算法实现strStr函数
实现strStr()函数。给定一个haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回-1。示例 1:输入: haystack = "hello", needle = "ll"输出: 2示例 2:输入: haystack = "aaaaa", needl...原创 2019-03-16 17:08:08 · 236 阅读 · 0 评论 -
程序员面试算法删除排序列表中的重复元素II
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字。示例1:输入: 1->2->3->3->4->4->5输出: 1->2->5示例2:输入: 1->1->1->2->3输出: 2->3/** * Definition for a singly-li...原创 2019-03-16 16:21:30 · 283 阅读 · 0 评论 -
程序员面试算法删除排序链表中的重复值
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。示例1:输入: 1->1->2输出: 1->2示例2:输入: 1->1->2->3->3输出: 1->2->3/** * Definition for a singly-linked list. * class ListNode { * ...原创 2019-03-16 16:19:45 · 214 阅读 · 0 评论 -
程序员面试算法移除元素
给定一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:给定 nums = [3,2,2,3], val = 3,函数应该返回新的长度 2, 并且 nums 中的前...原创 2019-03-16 14:59:03 · 142 阅读 · 0 评论 -
程序员面试算法删除排序数组中的重复值
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例1:给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。示例2:...原创 2019-03-16 14:57:52 · 220 阅读 · 0 评论 -
程序员面试算法买卖股票最佳时机
给定一个数组,它的第i个元素是一支给定股票第i天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。注意你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 ...原创 2019-03-12 10:18:49 · 195 阅读 · 0 评论 -
程序员面试算法最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。示例1:输入: ["flower","flow","flight"]输出: "fl"示例2:输入: ["dog","racecar","car"]输出: ""解释: 输入不存在公共前缀。说明:所有输入只包含原创 2019-03-16 13:52:12 · 206 阅读 · 0 评论 -
程序员面试算法最后一个单词的长度
给定一个仅包含大小写字母和空格' '的字符串,返回其最后一个单词的长度。如果不存在最后一个单词,请返回 0。说明:一个单词是指由字母组成,但不包含任何空格的字符串。示例:输入: "Hello World"输出: 5class Solution { /** * @param String $s * @return Integer ...原创 2019-03-11 22:49:01 · 112 阅读 · 0 评论 -
程序员面试算法求数组众数
给定一个大小为n的数组,找到其中的众数。众数是指在数组中出现次数大于⌊ n/2 ⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在众数。示例1:输入: [3,2,3]输出: 3示例2:输入: [2,2,1,1,1,2,2]输出: 2class Solution { /** * @param Integer[] $nums ...原创 2019-03-11 14:25:15 · 315 阅读 · 0 评论 -
程序员面试算法整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为[−231, 231− 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。...原创 2019-03-11 09:49:12 · 155 阅读 · 0 评论 -
程序员面试算法两数之和
给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]clas...原创 2019-03-10 19:09:47 · 227 阅读 · 0 评论 -
程序员面试算法只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例2:输入: [4,1,2,1,2]输出: 4class Solution { function singleNumber($nums...原创 2019-03-10 17:42:46 · 149 阅读 · 0 评论 -
php多进程消费kafka消息业务逻辑处理demo
这里提供的demo只是简单的打印了msg信息,大家可以按需调整。class EchoKafkaConsumerLow extends KafkaConsumerLowService{ function handleLogic($msg) { print_r($msg); }}class EchoKafkaConsumerHigh extends...原创 2019-03-06 14:48:26 · 1695 阅读 · 0 评论 -
php多进程消费kafka消息高阶API封装
高阶API是指API侧提供了自动负载均衡,不需要业务去处理。abstract class KafkaConsumerHighService extends KafkaConsumerBaseService{ function consumer($partion_id, $worker) { $conf = new \RdKafka\Conf(); ...原创 2019-03-06 14:40:21 · 1473 阅读 · 0 评论 -
php多进程消费kafka消息低阶API封装
php的kafka低阶API是指需要自行管理topic的partition信息,如果partition变动(增加或者减少),client侧需要自行处理负载均衡等,不然可能出现部分消息不处理的情形。abstract class KafkaConsumerLowService extends KafkaConsumerBaseService{ function consumer($pa...原创 2019-03-06 14:38:03 · 846 阅读 · 0 评论 -
Yii源码分析之Cache
Cache是支持不同缓存存储实现的缓存类的基类。数据项可以通过调用set()存储在缓存中,并通过get()稍后(在相同或不同的请求中)检索回来。在这两个操作中,都需要一个标识数据项的密钥。调用set()时也可以指定到期时间和/或依赖项。如果数据项到期或者在调用get()时依赖关系发生更改,则缓存将不返回任何数据。缓存的典型使用模式如下:$key = 'demo';$data = $...原创 2018-11-20 23:18:55 · 313 阅读 · 0 评论 -
Yii源码分析之CacheInterface
CacheInterface是缓存的基本接口。数据项可以通过调用set()存储在缓存中,并通过get()稍后(在相同或不同的请求中)检索回来。在这两个操作中,都需要一个标识数据项的密钥。调用set()时也可以指定到期时间和/或依赖项。如果数据项到期或者在调用get()时依赖关系发生更改,则缓存将不返回任何数据。缓存的典型使用模式如下:$key = 'demo';$data = $c...原创 2018-11-20 23:15:49 · 413 阅读 · 0 评论 -
PHP规范PSR13(超链接定义)事例
3. Interfaces3.1 Psr\Link\LinkInterface<?phpnamespace Psr\Link;/** * A readable link object. */interface LinkInterface{ /** * Returns the target of the link. * * The...翻译 2018-10-30 08:16:01 · 211 阅读 · 0 评论