Php
潘广宇
主攻Golang|Python|PHP|数据库|高并发架构|人工智能,Base广州,博客主要写一些工作上遇到的问题和处理经验
展开
-
Php 通过 FFmpeg 获取远程视频的时长和截图
突然发现 FFmpeg 这个软件还可以直接拉取远程视频的相关信息,也就是可以不通过下载视频到本地的方式,直接远程去获取视频时长和截图。经测试,以上过程的调用,并不需要完全把视频下载到本地再解析,可以实现远程获取直接秒级返回!假设我们的视频url是:http://my.com/a.mp4。第二步,通过composer安装FFmpeg的库。第一步,Linux 安装 FFmpeg 软件。原创 2024-04-23 17:52:46 · 862 阅读 · 2 评论 -
PhpSpreadsheet 读取 excel 里面的图片
使用 phpSpreadSheet 插件去读取 excel 里面的图片时发现坑点很多,这里做一个总结。这里会把excel里面的图片读取,然后存放到服务器指定的目录。解决方案:不要使用.xls格式的excel,使用.xlsx。在composer.json配置。我使用的是 tp 框架。composer安装。原创 2024-03-21 10:59:11 · 1089 阅读 · 2 评论 -
Swoole 4.8版本的安装
然后通过 phpinfo() 获取到加载的swoole模块。原创 2023-10-24 16:33:18 · 544 阅读 · 0 评论 -
PHP 通过 Redis 解决并发请求的操作问题
SETNX(SET if Not eXists)是 Redis 中的一个原子命令,用于设置键-值对,但只有在键不存在时才执行设置操作。可以利用 SETNX 命令来实现并发请求的互斥处理,确保只有一个请求能够成功执行。需要注意的是,即使 SETNX 返回 1,表示当前请求获取到了锁并执行了业务逻辑,仍需要在合适的时机释放锁,以防止死锁情况的发生。如果 SETNX 返回 1,表示当前请求是第一个获取到锁的请求,可以执行相应的业务逻辑;如果 SETNX 返回 0,表示已经有其他请求获取到了锁,当前请求不处理。原创 2023-08-31 10:36:49 · 1078 阅读 · 0 评论 -
基于 PHP 的 Kafka 底层公共类的封装和调用
以TP5.0框架为例,在extend/创建RdKafkaClient.php。如何在 Thinkphp 5.0 下使用 kafka,5分钟上手!注:本文用到的是rdkafka公共类库,原创 2023-05-06 20:09:32 · 624 阅读 · 0 评论 -
PHP Curl 使用 @ 上传文件失败的解决方法
遇到过一种情况,使用@+文件路径进行文件上传,然后Curl Post到另一个接口,发现测试环境是正常的,但正式环境却无法上传post不成功。如果不是上述php版本,则在curl配置。第一步,判断当前的 php 版本。原创 2023-04-18 19:31:19 · 446 阅读 · 0 评论 -
PHP 删除数组里的指定元素
【代码】PHP 删除数组里的指定元素。原创 2022-12-30 14:17:45 · 187 阅读 · 0 评论 -
Json_decode 遇到非 UTF-8 等特殊字符解决方案
需要解析的字符串包含特殊符号,这时候直接通过 json_decode 返回 NULL。然后通过过滤得到字符串:甛?eЮ,然后再 json_decode 可以返回正常格式。我的解决方案,把特殊字符转成?原创 2022-09-05 15:44:29 · 918 阅读 · 1 评论 -
PHP 快速了解命名空间
命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字命名空间将代码划分出不同的空间(区域),每个空间的常量、函数、类(为了偷懒,我下边都将它们称为元素)的名字互不影响一、基础1)命名空间的定义namespace Article; #当前脚本文件的第一个命名空间前面不能有任何代码2)同一脚本文件中可以创建多个命名空间//创建一个名为'Article'的命名空间namespace Article;//此Comment属于Article空间的元.原创 2022-05-10 20:06:45 · 27 阅读 · 0 评论 -
PHP array_filter 与 foreach 数组循环效率比较
通过 100w 个数字循环求余数判断,对比 array_filter 与 foreach 的效率编写一个 test_array_filter.php<?php$arr = range(0, 1000000); $start_time = microtime(true);$startMemory = memory_get_usage(); $f = array_filter($arr, function($var) { if ($var % 123 == 0) {原创 2022-05-06 14:01:10 · 268 阅读 · 0 评论 -
利用 PHP Trait 提高代码复用性
一、什么是 traitTrait 是从 PHP 5.4 加入的一种细粒度代码复用的语法。以下是官方手册对 Trait 的描述:Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 t原创 2022-05-01 16:42:42 · 177 阅读 · 0 评论 -
Swoole 介绍以及三步快速安装 swoole 教程
通过 swoole 可以编写高性能高并发的 TCP、UDP、Unix Socket、HTTP、 WebSocket 服务确保系统已经安装以下软件php-7.2 或更高版本gcc-4.8 或更高版本makeautoconf一、获取源码https://pecl.php.net/package/swoole二、编译安装wget https://pecl.php.net/get/swoole-4.8.9.tgztar -zxvf swoole-4.8.9.tgzcd swoo原创 2022-04-28 11:41:36 · 2877 阅读 · 0 评论 -
手把手写一个简单的 PHP 扩展
手把手教你写一个PHP扩展,以下通过PHP7.4版本实现,其他版本可能有差异,但整体流程相当。一、从官网下载源码包PHP: Downloads二、创建模块解压源码,找到 ext 目录,通过下面命令创建一个扩展模块./ext_skel.php --ext mymodel创建成功后,会有以下提示:三、编写模块的函数找到创建的模块路径 ext/mymodel1)在头文件声明函数找到 php_mymodel.h在这个头文件中声明了一个名为 mymodel的PHP空间原创 2022-04-26 19:42:23 · 1282 阅读 · 0 评论 -
分享一段 PHP 数组打印格式美化的函数
function print_R($vars, $label = '', $return = false) { if (ini_get('html_errors')) { $content = "<pre>\n"; if ($label != '') { $content .= "<strong>{$label} :</strong>\n"; } $content .=.原创 2022-04-25 16:34:02 · 900 阅读 · 0 评论 -
Php://input 和 $_POST / $http_raw_post_data 区别
一、php://input 介绍官网原话:php://input allows you to read raw POST data. It is a less memory intensive alternative to $HTTP_RAW_POST_DATA and does not need any special php.ini directives. php://input is not available with enctype=”multipart/form-dataphp://原创 2022-04-25 15:28:14 · 2409 阅读 · 0 评论 -
Redis 内存占满导致的 Setnx 命令执行失败
一、问题发生正常情况下,通过 setnx 设置的一个锁,应该会1s后过期(防止并发请求,处理相同逻辑),但是实际发生的情况是,第一次处理下面的逻辑,就抛出异常。说明 setnx 函数返回了 false。$redis_key_lock = 'lock'; //@todo 设置了一个1s的锁$lock = $redis->setnx($redis_key_lock, 1);//@todo 锁将会在1s后过期$redis->expire($redis_key原创 2022-04-22 11:39:16 · 2165 阅读 · 0 评论 -
Redis 异常 read error on connection 解决方案
造成原因与场景:在接口连接 redis 时,在 Redis->auth() 中抛出异常:PHP Fatal error: Uncaught exception 'RedisException' with message 'read error on connection'出现原因:通过 pconnect 的 redis 长连接不会主动释放,会一直保持在php-fpm进程中,等待完成下一个请求的任务。这样会出现以下两种情况:1)假如这个连接已经断开了,下个请求可能直接使用上个断..原创 2022-04-20 14:31:07 · 5540 阅读 · 0 评论 -
Php-fpm 与 FastCGI / CGI 的关系
一、CGI协议CGI全称是“通用网关接口”(Common Gateway Interface),它可以让一个客户端,从网页浏览器向执行在Web服务器上的程序请求数据。CGI描述了客户端和这个程序之间传输数据的一种标准。 CGI的一个目的是要独立于任何语言的,所以CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。 如php,perl,tcl等。运行原理客户端访问某个 URL 地址之后,通过 GET/POST/PUT 等方式提交数据,并通过 HTTP 协议向 Web 服务器原创 2022-04-15 12:01:01 · 909 阅读 · 0 评论 -
GET 请求参数过大导致HTTP错误码 414 / 500 的问题
看了很多文章描述,通过修改nginx配置可以解决 414 Request-URI Too Large 的问题,比如可以调大这些参数:client_header_buffer_size 512k;large_client_header_buffers 4 512k;client_max_body_size 100m;如果调大后,重启nginx,发现请求变成了 500 Internal Server Error,查看具体的 nginx 错误日志:[alert] 8300#0: *173067原创 2022-04-12 19:25:16 · 5076 阅读 · 1 评论 -
PHP 快速解决跨域问题
跨域介绍浏览器拥有同源策略限制确保安全,同源策略会阻止一个域的Javascript脚本和另外一个域的内容进行交互。当一个请求url的协议、域名(包括多级域名)、端口三者之间任意一个与当前页面url不同即为跨域。跨域限制1)无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB2)无法接触非同源网页的 DOM 节点3)无法向非同源地址发送 AJAX 请求跨域解决方案1)JSONP(只支持GET请求)Javascript:<s..原创 2022-03-02 09:55:46 · 7135 阅读 · 0 评论 -
Php 与 Erlang 通信模块 peb 函数文档
一、打开与 Erlang 节点的连接resource peb_connect ( string $server , string $cookie )参数:$server:erlang节点信息,格式如 nodename@host.domain$cookie:用于与此 Erlang 节点通信的 Cookie返回值:成功时返回 Erlang 节点链接标识符,失败时返回 FALSE 节点链接标识符注意:脚本执行结束后,指向服务器的链接将立即关闭,除非通过显式调用 peb_close(原创 2022-02-28 19:10:18 · 708 阅读 · 4 评论 -
PHP 一个例子简单理解反射类
反射:通过一个对象就能知道它所属的类、拥有哪些方法、属性等等类的信息。指在PHP运行状态中,扩展分析PHP程序,导出或提出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取信息以及动态调用对象方法的功能称为反射API。先看一个例子:<?phpclass person { public $name; public $gender; public function say(){ echo $this->name," \tis ",$t原创 2022-02-25 11:07:05 · 162 阅读 · 0 评论 -
利用 Opcache 优化 php 框架的性能瓶颈
场景:QPS不高,但CPU和内存消耗特别高,CPU消耗甚至达到100%排除因素:1、MySQL等数据库不存在慢查询2、有Redis等缓存机制3、接口代码不存在复杂逻辑、多层循环计算猜测:TP等PHP框架每次运行时需要加载大量框架文件,框架文件在编译过程中会造成服务器CPU消耗很大,导致接口性能下降解决方案:利用 Opcache 缓存编译好的文件,减少每次编译框架代码的次数Opcache介绍:Opcache通过将解析的PHP脚本预编译的字节码(Ope原创 2022-02-17 11:55:07 · 459 阅读 · 0 评论 -
总结 shell_exec 调用 php 脚本不成功的原因
最初的调用命令:shell_exec("php /data/web/code/think MyCronJob")正常情况下 MyCronJob 执行完成后,会输出文件日志到系统发现执行成功后,shell_exec返回NULL,查看日志也没有执行成功php脚本尝试:1、检查php.ini配置文件safe_mode 查看安全模式是否开启safe_mode_exec_dir 该参数指定了只有在特定目录中的外部程序才可以被执行disable_functions 禁用的函数2、原创 2022-02-16 16:50:16 · 2746 阅读 · 0 评论 -
Yar 搭建 RPC 服务
一、安装 Yarpecl install yarpecl install msgpack二、确保 php 加载 yar 模块php -m三、编写服务器端 Server.php , 在浏览器打开 http://.../Server.php 可见API的介绍如下<?phpclass API { public function some_method...原创 2019-03-10 15:53:43 · 2457 阅读 · 0 评论 -
多守护进程使用 kafka 注意事项(更新中)
问题1:消息处理问题存在两个守护进程,如果需要A、B两个守护进程每次获取的消息是一样的,则只需要使用同一个group_id读取同一个分区即可。如果只读取一个分区,则两个守护进程会同时获取相同的信息,比如生产者在一个topic生产了信息1,2,3,4,5,6,则两个守护进程都会同时获取到1,2,3,4,5,6如果希望两个守护进程是同时消费,也就是不会重复消费,这时候需要修改topic的分区,改成多个分区,比如2/usr/local/kafka/bin/kafka-topics.sh --al原创 2022-01-21 17:46:04 · 1199 阅读 · 0 评论 -
Thinkphp RdKafka 公共类封装
在 extend/RdKafkaClient.php 封装 RdKafkaClient:<?php/********************************************************************************* * @desc:Rd-kafka客户端进一步封装 * @Author:panguangyu * @Dtime:2021-01-20 **********************************************原创 2022-01-21 11:34:25 · 1570 阅读 · 5 评论 -
PHP rdKafka 安装和基本使用
安装,通过安装扩展即可,不需要额外新增源码Installation (le-blanc.net)生产者demo:<?php$conf = new RdKafka\Conf();$conf->set('metadata.broker.list', 'localhost:9092');$producer = new RdKafka\Producer($conf);$topic = $producer->newTopic("test");for ($i = 0;原创 2022-01-21 11:27:05 · 1591 阅读 · 0 评论 -
重复的 Delete 语句导致 MySQL Deadlock
如果某条delete语句带有where条件,执行时间较长,并发执行相同查询条件的该语句会产生Deadlock死锁,解决方案:引入Redis加入锁机制举个例子:<?phpfunction myconf() { $sql = "delete * from test where field1 = '{$field1}' and field2 = '{$field2}'"; $lock = "delete_lock_" . md5($field1 . $field2)原创 2021-12-29 14:31:48 · 816 阅读 · 0 评论 -
ThinkPHP 框架建立 PostgreSQL / 腾讯云 TDSQL PgSQL (TBase) 连接
一、TDSQL 介绍二、在 ThinkPHP 代码目录建立新的数据库连接文件/Config/extra/database_pgsql.php<?phpreturn [ // 数据库类型 'type' => 'pgsql', // 服务器地址 'hostname' => 'xxxx', // 数据库名 'database' => 'xxxx', //原创 2021-12-29 11:47:28 · 1691 阅读 · 0 评论 -
PHP 获取真实 IP 的正确姿势
在PHP中,常见获取请求IP的方式一般是通过3个超全局变量,不过很显然三种获取IP的方式并不完全可靠。$_SERVER['REMOTE_ADDR']; // 客户端与服务器握手IP,如果使用代理则会获取到代理IP$_SERVER['HTTP_CLIENT_IP']; // 代理服务器发送的HTTP头(可伪造)$_SERVER['HTTP_X_FORWARDED_FOR']; // 用户是在哪个IP使用的代理(可伪造)如果域名没有经过代理,一般稳原创 2021-12-29 11:29:34 · 5005 阅读 · 0 评论 -
PHP5.5 peb.so / peb_connect 不能使用问题
很多游戏项目会使用 peb.so (php二郎桥)进行 php 与 erlang 通信,如果发现@peb_connect();这个参数执行中断了,与此同时peb_error()并没有抛出任何异常这时候查看系统日志cat /var/log/messages发现有报错日志猜测是扩展在当前php版本不能使用(编译安装 peb.so 时正常安装),因为此前版本正常,升级php版本后出现异常。实测 peb.so 在 php5.5+ 是不能使用的,实测可以使用的版本是...原创 2021-12-07 17:17:49 · 352 阅读 · 0 评论 -
TP Cron 脚本传入自定义参数
直接传参会报错:php ./think Welfare 123返回失败信息:[RuntimeException] Too many arguments. 此时,需要新增一个额外的参数配置在脚本文件里在configure方法中,增加a参数protected function configure(){ $this->addArgument('a', Argument::REQUIRED); // 必须参数}在execute方法中获取a参数的值p原创 2021-08-27 15:07:52 · 695 阅读 · 0 评论 -
单双引号带来的 md5 值的不同
<?php$a = '[{"mom_id":1,"son_id":2}]';echo md5($a);// 1939df8c972445c0efebf3f910ccbfc9?><?php$a = "[{\"mom_id\":1,\"son_id\":2}]";echo md5($a);// 1939df8c972445c0efebf3f910ccbfc9?><?php$a = '[{\"mom_id\":1,\"son_id\".原创 2021-08-04 11:29:20 · 300 阅读 · 0 评论 -
小记:正则匹配花括号内容
如字符串:a(1)b(2)c(3),需要获取一个数组1,2,3通过正则表达式 \((.+?)\) 匹配preg_replace_callback( '/\((.+?)\)/', function ($match) use (&$field_value) { var_dump($match); // 匹配的内容赋给回调原创 2021-07-07 11:51:28 · 425 阅读 · 0 评论 -
preg_replace_callback 提示 to be a valid callback 错误解决
原代码:public function explain_which_rule($rules) { $rule_detail = $rules[1]; echo preg_replace_callback( '/&(\d+)@(\w+)\.(\w+)/', "rule_1_explain_by_config_file", $rule_detail); global原创 2021-07-02 11:35:15 · 614 阅读 · 0 评论 -
php 删除特定元素
$array = array("a", "b", "c", "d");foreach($array as $k=>$v){ if($v == 'b'){ unset($array[$k]): }}var_dump($array); // 返回 array("a", "c", "d");原创 2021-01-20 16:22:28 · 101 阅读 · 0 评论 -
关于 json_encode 第二个参数不支持的替代方案
由于Php版本较低,常出现 json_encode函数第二个参数不能使用的情况,若使用了官方的通过制定int数字的方式也不可以,可通过正则表达式匹配的方式进行处理JSON_UNESCAPED_UNICODE 主要是json化过程中将中文按原来的方式进行保留,不进行unicode的转码,可通过下面方式进行变相处理:$text = array(); // 等待...原创 2019-12-27 20:54:25 · 259 阅读 · 0 评论 -
Html 表单渲染包含 Html 标签的文本
希望在input中的value放入html标签的内容,而不被解析成乱码,如:<input type="text" value="<url={"type":2, "args":{"openUrl":"www.baidu.com"}}>需要显示的内容</url>" />可以通过php函数处理:$a = '<url={"type":2, "arg...原创 2019-12-24 20:22:48 · 798 阅读 · 0 评论 -
Php 通过数组导出Excel CSV文件
表头数组格式如下:$header = array( 0 => "id", 1 => "用户名称", 2 => "用户性别", 3 => "金额");表数据格式如下:$data = array( /* 第一行 */ 0 => array( 0 => 1, ...原创 2019-10-28 14:36:43 · 571 阅读 · 0 评论