supervisord 中的 open files 数量限制
Linux 中的 nofile 设置Linux 系统通过 rlimit 来对一个进程可以使用的计算机资源进行限制,其中 nofile 表示单个进程可以打开的文件句柄数,默认值为 1024。 我们知道,Linux 系统下一切都是文件,这不仅包括了常规的文件,还包括 socket, pipe 等等,对于一些较大的应用,如数据库,Web 服务器等,1024 这个限制肯定是不够的。所以一般在初始化新服务器时都要进行修改,例如修改 /etc/security/limits.conf,把所有用户的 nofile 限制设置为 65535,其中,* 不能用于 root 用户,root 用户必须显式地使用 root 定义。 root soft nofile 65535root hard nofile 65535* soft nofile 65535* hard nofile 65535 查看当前 Shell 的 nofile 限制,可以使用 > ulimit -n65535 查看某一个进程的 nofile 限制,可以使用 > cat /proc/$PID/limitsLimit...
Redis 高效删除大key
一、大key的删除问题大key(bigkey)是指 key 的 value 是个庞然大物,例如 Hashes, Sorted Sets, Lists, Sets,日积月累之后,会变得非常大,可能几十上百MB,甚至到GB。 如果对这类大key直接使用 del 命令进行删除,会导致长时间阻塞,甚至崩溃。 因为 del 命令在删除集合类型数据时,时间复杂度为 O(M),M 是集合中元素的个数。 Redis 是单线程的,单个命令执行时间过长就会阻塞其他命令,容易引起雪崩。 二、解决方案可靠方案: 渐进式删除UNLINK (4.0版本以后) 1. 渐进式删除思路: 分批删除,通过 scan 命令遍历大key,每次取得少部分元素,对其删除,然后再获取和删除下一批元素。 示例: 删除大 Hashes 步骤: (1)key改名,相当于逻辑上把这个key删除了,任何redis命令都访问不到这个key了(2)小步多批次的删除 伪代码: # key改名newkey = "gc:hashes:" + redis.INCR( "gc:index" )redi...
Mysql 使用全文索引(FullText index)
简单介绍MySQL全文索引是在基于文本的列(char、varchar或text列)上创建的,以提升对这些列中包含的数据的查询和DML操作效率。全文索引被定义为create table语句的一部分,或者使用alter table或create index追加到现有表中。搜索语法为:match(field1,field2,…) against(’keyword‘),更多使用方法及详细信息参考 MySQL全文索引官方文档 版本说明MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引 MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引 只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引 创建全文索引说明:搜索时,默认对中文类分词支持不友好,如果有中日韩文分词需求,在创建索引时,需要声明该分词插件ngram,语法可选【with parser ngram】 建表时创建create table product ( id int(11) NOT null auto_increment, de...
PHP 捕获Fatal error错误与异常处理
php中的错误和异常是两个不同的概念。 错误:是因为脚本的问题,比如少写了分号,调用未定义的函数,除0,等一些编译语法错误。 异常:是因为业务逻辑和流程,不符合预期情况,比如验证请求参数,不通过就用 throw new 抛一个异常。 在php5的版本中,错误是无法被 try {} catch 捕获的,如下所示: <?phperror_reporting(E_ALL);ini_set('display_errors', 'on');try { hello();} catch (\Exception $e) { echo $e->getMessage();} 运行脚本,最终php报出一个Fatal error,并程序中止。 Fatal error: Uncaught Error: Call to undefined function hello() 有些时候,我们需要捕获这种错误,并做相应的处理。 那就需要用到 register_shutdown_function() 和...
Redis 抛错 : send of 31 bytes failed with errno=32 Broken pipe
Notice: Redis::get(): send of 31 bytes failed with errno=32 Broken pipe in 启两个进程 调研 redis::get 测试 自己本机测试 配置最大客户端连接数 CONFIG set maxclients 2 错误消息 “send of 31 bytes failed with errno=32 Broken pipe“ 表明在尝试发送数据时,管道 (pipe) 被中断了。这通常是由于以下几个原因导致的: 网络连接问题:可能是网络连接不稳定或断开导致的。检查网络连接,确保网络正常并且没有断开。 资源限制:可能是由于系统资源限制而导致的。当系统中的某些资源(如文件描述符、内存等)达到了限制时,可能会出现此错误。可以通过增加系统资源限制或优化代码来解决。` 程序错误:可能是代码中存在错误或逻辑问题导致的。检查代码逻辑,确保没有错误或异常情况。 针对这个错误,你可以尝试以下几个解决方法: 检查网络连接:确保网络连接正常,并且没有任何网络问题。 检查资源限制:查看系统资源限制,特别是文件描述符和内存限制。如果...
Mysql 批量替换数据库中某个字段内容的sql语句
近年来由于我国新广告法的实施,大量企业网站充斥着违法违规敏感广告词,导致企业被市场监查部门罚款,那么我们企业网站中存在的违法违规敏感广告词可不可以一键替换呢?答案是可以的,下面我们以织梦dedecms程序为例,如何利用织梦数据SQL命令语句一键替换。例如织梦数据库中某个字段包含有违法违规敏感广告词,我们需要把这些广告词进行替换,大兵给大家提供一段SQL命令语句: UPDATE `表名` SET `字段名` = replace (`字段名`,’需要被替换字符’,’将要替换成的字符’); 例如:我要将body字段中所有“最”,全部替换为“较”,如下图所示:表名:zmy_addonarticle字段名称:body 点击SQL命令,输入以下SQL命令语句: update zmy_addonarticle set body=replace(body,’最’,’较’) 最后点击左下角的“执行”命令,body字段中所有“最”,就全都被替换为“较”了,最后在织梦网站后台更新全站内容,再看看前台页面内容变了没有。
PHP 判断字符串是否有包含乱码
判断一个字符串是否包含乱码: 可以用正则匹配,但是你需要知道乱码大概包括的符号有哪些。 运用黑魔法之json_encode($string) === 'null' 来判断。如果字符串中含有乱码,json_encode该字符串就会返回null。 function isGarbled($content){ $json = \json_encode((array)$content); return $json == false;}
[踩坑] Base64_decode 导致 Malformed UTF-8 characters, possibly incorrectly encoded
$str = 'good, luck';$content = base64_decode($str);var_dump($content);$content = $content ?: $str;echo \json_encode($content), PHP_EOL;echo json_last_error_msg(),PHP_EOL; output… $ string(6) ""$ Malformed UTF-8 characters, possibly incorrectly encoded 问题如上, 特殊场景正常字符串使用 base64_decode 解码 字符串 异常解码 输出虽然是 “” 但实际上编码已发生改变.修复上述问题. # 二参数 strict 当设置 strict 为 true 时,一旦输入的数据超出了 base64 字母表,将返回 false。 否则会静默丢弃无效的字符。$content = base64_decode($str, true); 上面的 base64_decode 二参数亲测不咋好用呀 ‘...
Curl 抛错 no route to host
curl ip.me --proxy 127.0.0.1:8888 异常错误 : no route to host PHP 程序下 curl 使用代理访问 errNo : 7 errMsg : Failed to connect to 127.0.0.1 port 8888: No route to host 知乎上找到一些答案, 防火墙还是有原因的 这种情况一般是数据包命中了iptables的--reject-with icmp-host-prohibited规则。iptables对进入的数据包有三种处理链INPUT,OUTPUT,FORWARD。从iptables的第一条规则开始执行,如果都没命中,一般在最后会有一条 -A INPUT -j REJECT --reject-with icmp-host-prohibited。这时客户端会显示 No route to host,tcpdump抓包显示服务端返回的icmp包中,Type是3:目的不可达,Code是10:目的主机被强制禁止。
Swoole 出现 deadlock 字样
=================================================================== [FATAL ERROR]: all coroutines (count: 1) are asleep - deadlock!=================================================================== [Coroutine-1]--------------------------------------------------------------------#0 Swoole\Coroutine\Http\Client->recv() called at [/opt/webserver/vendor/swlib/saber/src/WebSocket.php:102]#1 Swlib\Saber\WebSocket->recv() called at [/opt/webserver/script/src/Task/BinanceContract.php:133]#...



