首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
185 阅读
2
php接口优化 使用curl_multi_init批量请求
145 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
34
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
560
篇与
的结果
2023-08-10
解决PHP脚本pdo MySQL has gone away错误 pdo加ping功能
解决PHP脚本pdo MySQL has gone away错误 pdo加ping功能<?php class NPDO { private $pdo; private $params; public function __construct() { $this->params = func_get_args(); $this->init(); } public function __call($name, array $args) { try { return call_user_func_array(array($this->pdo, $name), $args); } catch (PDOException $e) { } } public function ping() { try { $this->pdo->query('SELECT 1'); $error=$this->pdo->errorInfo();//由于pdo扩展的bug,有时不抛出异常,这里要加上错误信息 if ($error[2]=='MySQL server has gone away') { $this->init(); } } catch (PDOException $e) { $this->init(); } return true; } private function init() { try { $class = new ReflectionClass('PDO'); $this->pdo = $class->newInstanceArgs($this->params); } catch (PDOException $e) { } } } $flysystempdo = new NPDO('mysql:dbname=test;host=localhost', 'root','root'); $flysystempdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); while (true) { $flysystempdo->ping(); $sql = 'SELECT 1'; $aa=$flysystempdo->query($sql); var_dump($aa); sleep(1); }//另外2种http://blog.csdn.net/fdipzone/article/details/53117541http://blog.csdn.net/coprophet/article/details/18364641
2023年08月10日
9 阅读
0 评论
0 点赞
2023-08-10
PHP控制缓存输出之ob系列函数详解
PHP控制缓存输出之ob系列函数详解ob,输出缓冲区,是output buffering的简称,而不是output cache。ob用对了,是能对速度有一定的帮助,但是盲目的加上ob函数,只会增加CPU额外的负担ob的基本原则:如果ob缓存打开,则echo的数据首先放在ob缓存。如果是header信息,直接放在程序缓存。当页面执行到最后,会把ob缓存的数据放到程序缓存,然后依次返回给浏览器。基本作用下面我说说ob的基本作用:1)防止在浏览器有输出之后再使用setcookie()、header()或session_start()等发送头文件的函数造成的错误。其实这样的用法少用为好,养成良好的代码习惯。2)捕捉对一些不可获取的函数的输出,比如phpinfo()会输出一大堆的HTML,但是我们无法用一个变量例如$info=phpinfo();来捕捉,这时候ob就管用了。3)对输出的内容进行处理,例如进行gzip压缩,例如进行简繁转换,例如进行一些字符串替换。4)生成静态文件,其实就是捕捉整页的输出,然后存成文件。经常在生成HTML,或者整页缓存中使用。对于刚才说的第三点中的GZIP压缩,可能是很多人想用,却没有真用上的,其实稍稍修改下代码,就可以实现页面的gzip压缩。代码如下:ob_start(ob_gzhandler);要缓存的内容没错,加一个ob_gzhandler这个回调函数就可以了,不过这么做有些小问题,一是需要zlib支持,二是没有判断浏览器是否支持gzip(现在好像都支持,iphone浏览器好像都支持了)。以前的做法是判断一下浏览器是否支持gzip,然后用第三方的gzip函数来压缩ob_get_contents() 的内容,最后echo。';ob_start();echo 'level 2';ob_start();echo 'level 3';ob_end_flush();ob_end_flush();ob_end_flush();很明显,结果为:level 1level 2level 3当程序修改一下,修改一个ob_end_flush() 变成 ob_end_clean() 成为以下这个,你觉得结果会是怎样呢?附上这几个函数的讲解:ob_clean — 清空(擦掉)输出缓冲区ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲ob_flush — 冲刷出(送出)输出缓冲区中的内容ob_start — 打开输出控制缓冲';ob_start();echo 'level 2';ob_start();echo 'level 3';ob_end_clean();//修改处ob_end_flush();ob_end_flush();结果:level 1level 2可能你会认为ob_end_clean()会清除与他最近的ob_start()的输出;其实这个说法不是很全面,看下面的例子';ob_start();echo 'level 2';ob_start();echo 'level 3';ob_end_clean(); //第一次修改ob_end_flush();ob_end_clean(); //第二次修改这次,什么都没有输出来。中间不是有一个ob_flush()吗?按理来说应该是输出 level2 的。其实造成这样的主要原因是输出的多级缓冲机制。这个程序例子有三个ob_start(),就意味着他有3个缓冲区A,B,C,而其实php程序本身也有一个最终输出的缓冲区,我们就把他叫做F。在这个程序中他这几个缓冲区是有一定层次的,C->B->A->F,F层次最高,是程序最终的输出缓冲,我们按上面的程序来进行讲解。刚开始。 F:nullob_start();新建缓冲区A。 A: null -> F:nullecho 'level 1';程序有输出,输出进入最低的缓冲区A A: 'level 1' -> F:nullob_start();新建缓冲区B 。 B:null -> A: 'level 1' -> F:nullecho 'level 2';程序有输出,输出进入最低的缓冲区B B:'level 2' -> A: 'level 1' ->F:nullob_start();新建缓冲区C C:null B:'level 2' A: 'level 1' -> F:nullecho 'level 3';程序有输出,输出进入最低的缓冲区C C:'level 3' -> B:'level 2' -> A: 'level 1' -> F:nullob_end_clean(); //第一次修改缓冲区C被清空并关闭。 B:'level 2' -> A: 'level 1' -> F:nullob_end_flush();缓冲区B输出到上一级的缓冲区A并关闭。 A: 'level 1level 2' -> F:nullob_end_clean(); //第二次修改缓冲区A被清空并关闭。 此时缓冲区A的东西还没真正输出到最终的F中,因此也就整个程序也就没有任何的输出了。ob其他的函数还有很多,但只要能懂得这些机理应该也是不难懂的。附上其余函数ob_start(); //打开一个输出缓冲区,所有的输出信息不再直接发送到浏览器,而是保存在输出缓冲区里面。ob_clean(); //删除内部缓冲区的内容,不关闭缓冲区(不输出)。ob_end_clean(); //删除内部缓冲区的内容,关闭缓冲区(不输出)。ob_get_clean(); //返回内部缓冲区的内容,关闭缓冲区。相当于执行 ob_get_contents() and ob_end_clean()ob_flush(); //发送内部缓冲区的内容到浏览器,删除缓冲区的内容,不关闭缓冲区。ob_end_flush(); //发送内部缓冲区的内容到浏览器,删除缓冲区的内容,关闭缓冲区。ob_get_flush(); //返回内部缓冲区的内容,并关闭缓冲区,再释放缓冲区的内容。相当于ob_end_flush()并返回缓冲区内容。flush(); //将ob_flush释放出来的内容,以及不在PHP缓冲区中的内容,全部输出至浏览器;刷新内部缓冲区的内容,并输出。ob_get_contents(); //返回缓冲区的内容,不输出。ob_get_length(); //返回内部缓冲区的长度,如果缓冲区未被激活,该函数返回FALSE。ob_get_level(); //Return the nesting level of the output buffering mechanism.ob_get_status(); //Get status of output buffers.ob_implicit_flush(); //打开或关闭绝对刷新,默认为关闭,打开后ob_implicit_flush(true),所谓绝对刷新,即当有输出语句(e.g: echo)被执行时,便把输出直接发送到浏览器,而不再需要调用flush()或等到脚本结束时才输出。ob_gzhandler //ob_start回调函数,用gzip压缩缓冲区的内容。ob_list_handlers //List all output handlers in useoutput_add_rewrite_var //Add URL rewriter valuesoutput_reset_rewrite_vars //Reset URL rewriter values这些函数的行为受php_ini设置的影响:output_buffering //该值为ON时,将在所有脚本中使用输出控制;若该值为一个数字,则代表缓冲区的最大字节限制,当缓存内容达到该上限时将会自动向浏览器输出当前的缓冲区里的内容。output_handler //该选项可将脚本所有的输出,重定向到一个函数。例如,将 output_handler 设置为 mb_output_handler() 时,字符的编码将被修改为指定的编码。设置的任何处理函数,将自动的处理输出缓冲。implicit_flush //作用同ob_implicit_flush,默认为Off。1、使 header() 函数前可以有echo代码Output Control 函数可以让你自由控制脚本中数据的输出。它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况。输出控制函数不对使用 header() 或 setcookie(),发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用。ob_start(); //打开缓冲区echo "Hello\n"; //输出header(“location:index.php”); //把浏览器重定向到index.phpob_end_flush(); //输出全部内容到浏览器所有对header()函数有了解的人都知道,这个函数会发送一段文件头给浏览器,但是如果在使用这个函数之前已经有了任何输出(包括空输出,比如空格,回车和换行)就会提示出错。如果我们去掉第一行的ob_start(),再执行此程序,我们会发现得到了一条错误提示:"Header had all ready send by"!但是加上ob_start,就不会提示出错,原因是当打开了缓冲区,echo后面的字符不会输出到浏览器,而是保留在服务器,直到你使用flush或者ob_end_flush才会输出,所以并不会有任何文件头输出的错误!2、保存 phpinfo() 函数的输出ob_start(); //打开缓冲区phpinfo(); //使用phpinfo函数$info = ob_get_contents(); //得到缓冲区的内容并且赋值给$info$file = fopen('info.txt', 'w'); //打开文件info.txtfwrite($file, $info); //写入信息到info.txtfclose($file); //关闭文件info.txt3、静态模版技术所谓静态模版技术就是通过某种方式,使得用户在client端得到的是由PHP产生的html页面。如果这个html页面不会再被更新,那么当另外的用户再次浏览此页面时,程序将不会再调用PHP以及相关的数据库,对于某些信息量比较大的网站,例如sina、163、sohu。类似这种的技术带来的好处是非常巨大的。ob_start(); //打开缓冲区php页面的全部输出$content = ob_get_contents(); //取得php页面输出的全部内容$fp = fopen("output00001.html", "w"); //创建一个文件,并打开,准备写入fwrite($fp, $content); //把php页面的内容全部写入output00001.html,然后……fclose($fp);注意事项:1、一些Web服务器的output_buffering默认是4069字符或者更大,即输出内容必须达到4069字符服务器才会flush刷新输出缓冲,为了确保flush有效,最好在ob_flush()函数前有以下语句:print str_repeat("", 4096); //以确保到达output_buffering值2、ob_* 系列函数是操作PHP本身的输出缓冲区,所以ob_flush只刷新PHP自身的缓冲区,而flush是刷新apache的缓冲区。所以,正确使用俩者的顺序是:先ob_flush,然后flush。ob_flush是把数据从PHP的缓冲中释放出来,flush是把缓冲内/外的数据全部发送到浏览器。3、不要误认为用了ob_start()后,脚本的echo/print等输出就永远不会显示在浏览器上了。因为PHP脚本运行结束后,会自动刷新缓冲区并输出内容。
2023年08月10日
17 阅读
0 评论
0 点赞
2023-08-10
PHP调试的强悍利器之PHPDBG
PHP调试的强悍利器之PHPDBGPHPDBG是一个PHP的SAPI模块,可以在不用修改代码和不影响性能的情况下控制PHP的运行环境。PHPDBG的目标是成为一个轻量级、强大、易用的PHP调试平台。可以在PHP5.4和之上版本中使用。在php5.6和之上版本将内部集成。主要功能:? 单步调试? 灵活的下断点方式(类方法、函数、文件:行、内存地址、opcode)? 可直接调用php的eval? 可以查看当前执行的代码? 用户空间API(userland/user space)? 方便集成? 支持指定php配置文件? JIT全局变量? readline支持(可选),终端操作更方便? 远程debug,使用java GUI? 操作简便(具体看help)安装为了使用phpdgb,你首先需要下载一个php的源码包。然后下载phpdgb的源码包,并放在php源码包的sapi目录下。最后,你就可以执行命令安装了。编译安装示例如下:假设我们已经下载php的源码包,并放在了/home/php目录下。cd /home/php/sapi#git clone https://github.com/krakjoe/phpdbg#cd ../#./buildconf --force#./config.nice#make -j8#make install-phpdbg注意:1、如果你的php版本是php5.6或者更高的版本,phpdbg已经集成在php的代码包中,无需单独下载了。2、编译参数中记得要加 ?enable-phpdbg。3、编译时参数,?with-readline 可以选择性添加。如果不添加,phpdbg的history等功能无法使用。基本使用1、参数介绍phpdbg是php的一个sapi,它可以以命令行的方式调试php。常用参数如下:The following switches are implemented (just like cli SAPI):-n ignore php ini-c search for php ini in path-z load zend extension-d define php ini entryThe following switches change the default behaviour of phpdbg:-v disables quietness-s enabled stepping-e sets execution context-b boring ? disables use of colour on the console-I ignore .phpdbginit (default init file)-i override .phpgdbinit location (implies -I)-O set oplog output file-q do not print banner on startup-r jump straight to run-E enable step through eval()Note: passing -rr will cause phpdbg to quit after execution, rather than returning to the console2、常用功能之前我们介绍过gdb工具。其实phpdbg和gdb功能有些地方非常相似。如,可以设置断点,可以单步执行,等。只是他们调试的语言不一样,gdb侧重于调试c或者c++语言,而phpdbg侧重于调试php语言。下面我们将对phpdbg的一些常用调试功能做下介绍。要调试的代码如下:文件test_phpdbg_inc.php源代码如下:<?php function phpdbg_inc_func(){ echo "phpdbg_inc_func \n"; } ?>文件test_phpdgb.php的源代码如下:<?php include(dirname(__FILE__)."/test_phpdbg_inc.php"); class demo{public function __construct(){ echo __METHOD__.":".__LINE__."\n"; } public function func($param){ $param++; echo "method func $param\n"; } public function __destruct(){ echo __METHOD__.":".__LINE__."\n"; }} function func(){ $param = "ali"; $param = $param + "baba"; echo "function func $param\n"; }$demo = new demo(); $demo->func(1); func(); phpdbg_inc_func();?>3、启动phpdbgphpdbg安装成功后,会在安装目录的bin目录下。进入bin目录,直接输入phpdbg即可。如下:phpdeg[Welcome to phpdbg, the interactive PHP debugger, v0.4.0]To get help using phpdbg type "help" and press enter[Please report bugs to http://github.com/krakjoe/phpdbg/issues]prompt>要想加载要调试的php脚本,只需要执行exec命令即可。如下:phpdbg......prompt> exec ./test_phpdbg.php当然我们也可以在启动phpdbg的时候,指定e参数。如下:phpdbg -e ./test_phpdbg.php4、查看帮助信息如果你之前使用过其他的调试工具,你会发现phpdbg和他们比较相似。但是,你使用初期,还是会经常需要获取帮助信息。通过help命令我们可以获取帮助信息。......prompt> helpphpdbg is a lightweight, powerful and easy to use debugging platform for PHP5.4+It supports the following commands:Information list list PHP source......5、设置断点设置断点的命令和gdb一样。都是break,简写形式为b。不过具体的命令参数还是有所差异的。和gdb的断点命令相同之处,它们都可以“按文件名:行号” 或者 行号的方式设置断点。除此之外,phpdbg还提供了一些针对php特有的设置断点的方式。如,根据opline设置断点,根据opcode设置断点等。众所周知,php代码最终是解析成opcode,然后由php内核一条条执行。一条php语句,可能会解析成多条opcode。如果可以按opcode设置断点,我们就可以更精确的跟踪程序执行过程。下面我们来看看phapdbg设置断点的具体示例。按opline设置断点:这里所说的opline,就是以方法入口作为起点,当前代码的行号。如test_phpdgb.php文件中,第18行的代码“$param = $param + “baba”;”的opline就是 2。......prompt> b func#2prompt> rdemo::__construct:5method func 2[Breakpoint #0 resolved at func#2 (opline 0x7f5b230a2e38)][Breakpoint #0 resolved at func#2 (opline 0x7f5b230a2e38)][Breakpoint #0 resolved at func#2 (opline 0x7f5b230a2e38)][Breakpoint #0 in func()#2 at ./test_phpdbg.php:18, hits: 1]00018: $param = $param + "baba"; 00019: echo "function func $param\n";; 00020: }......6、查看断点和gdb一样,phpdbg也是使用info break命令查看断点。示例如下:....prompt> info break------------------------------------------------File Breakpoints:#1 /home/hailong.xhl/test_phpdbg.php:10------------------------------------------------Opline Breakpoints:#0 7ff3219e1df0 (function breakpoint)------------------------------------------------Function opline Breakpoints:#0 func opline 2....通过上面的显示,我们可以知道。info break的显示结果中会把断点的类型也给显示出来。#后面的数字是断点号。我们可以根据断点号删除断点。7、删除断点和gdb命令不一样。phpdbg的删除断点不是delete命令,而是break del 命令。示例如下:......prompt> break del 1[Deleted breakpoint #1]prompt>......break del 后面的数字1就是断点号。8、查看代码phpdbg查看代码的命令也是list。但是和gdb相比,使用的方式更多样一些。显示指定函数的代码:......prompt> l f func 00017: $param = "ali"; 00018: $param = $param + "baba"; 00019: echo "function func $param\n";; 00020: } 00021:prompt>......单步执行phpdbg的单步执行只有一个命令 step。和gdb的step命令差不多。都是一行一行的执行代码。注意,phpdbg是没有next命令的。....prompt> sBreakpoint #0 resolved at func#2 (opline 0x152ba40)00019: echo "function func $param\n";; 00020: } 00021:....继续执行和gdb一样,phpdbg的继续执行命令也是continue,简写形式为c。执行php代码这个是phpdbg的一个特色。可以在调试的过程中使用ev命令执行任意的php代码。如:......prompt> ev $var = "val";valprompt> ev var_dump($var);string(3) "val"......可以通过这种方式,在调试过程中动态的修改变量值,查看执行效果。
2023年08月10日
10 阅读
0 评论
0 点赞
2023-08-10
php session阻塞页面分析及优化 (session_write_close session_commit使用)
php session阻塞页面分析及优化 (session_write_close session_commit使用)这个问题很多做PHP开发朋友应该都有遇到过,一个启用了session_start 页面,由于执行时间过长。导致用户访问另外一个很简单的启用session_start页面一直阻塞着。 直到第一个页面执行完了。第二个页面才可以读取。这个就是,我们常说的,session阻塞机制。也就是说session是有锁的,为防止并发的写会话数据,php自带的的文件保存会话数据是加了一个互斥锁(在session_start()的时候)。程序执行session_start(),此时当前程序就开始持有锁。程序结束,此时程序自动释放Session的锁。如果同一个客户端同时并发发送多个请求(如ajax在页面同时发送多个请求),且脚本执行时间较长,就会导致session文件阻塞,影响性能。因为对于每个请求,PHP执行session_start(),就会取得文件独占锁,只有在该请求处理结束后,才会释放独占锁。这样,同时多个请求就会引起阻塞。我用file 存放用户sessionsession默认以文件保存,当一个用户访问session_start页面后,这个时候,就会默认创建一个包含session_id文件名,并且这个时候,会对文件进行锁定。如果这个用户点击链接,又访问一个该站session_start网页。这是,由于session_id一样,这个页面也有读取锁定该用户存放session文件。 由于,第一个页面没有执行完,它一直锁定了该文件。 第2个页面就不能获取锁,一直处于等待状态。这样一个看似小的问题,实际上,如果网站上面有大量用户访问,会导致session读取文件一直阻塞等待着。用户浏览器一直跟服务器保持连接,会消耗很多服务器资源。web服务器活跃连接数也会增大,可能很快就会耗费完连接资源,出现拒绝服务器。我用memcache 存放用户session用memcache保存用户session,相比读取文件有很大速度提升。而且可以做到多服务器共享session。确实很方便,这个时候,我们发现不会出现用文件保存session锁定清理。memcached读取时候,是共享的,不会出现等待。但是,我们会发现,memcached连接数,还是会保持着。并且,连接数会增加,如果这个时候,你设置的memcached连接数过小,你会发现,很快memcached就挂死了。 这也是,做memcache接管session时候,经常遇到问题。 有时候,web服务器很多,session(memcache)很少。发现memcache莫名其妙死掉,可能跟这个有关系。太多反映很慢的页面(启动session),会导致占用了大量memcached连接数。改变session使用习惯、优化调用方法其实,通过file或者session,如果处理耗时页面,都会带来服务器资源很大消耗。其实我们一般写入session或者读取时候,如果自己能够控制。用完了,就关闭掉文件锁,或者mem连接。就会自动释放资源,其实,php里面的:session_write_close,session_commit 函数就能做到改功能。我们看下下面代码执行过程:<?phpini_set('session.save_path', './tmp/');function open($save_path, $session_name) {echo __FUNCTION__,"<br/>"; return (true);}function close(){echo __FUNCTION__,"<br/>"; return (true);}function read($id){echo __FUNCTION__,"<br/>";}function write($id, $sess_data){echo __FUNCTION__,"<br/>"; return (true);}function destroy($id){echo __FUNCTION__,"<br />"; return(true);}function gc($maxlifetime){echo __FUNCTION__,"<br />"; return true; }session_set_save_handler("open", "close", "read", "write", "destroy", "gc");register_shutdown_function('test');function test(){ echo __FUNCTION__,"";}session_start();echo 'aaaaa',"";/*结论->session_start开启后, 会自动执行open,read函数。等页面执行完后,会执行shutdown函数.最后后会把session写入进去,然后执行close关闭文件从session_start 到页面结束,会一直锁定文件或者保持连接的。*/然后通过1个实例子来理解 , 先执行 session2.php 代码, 20秒内执行 session3.phpsession2.php 文件<?php//执行 session2.php和session3.php, /*因为 session2.php 脚本一直没有结束,结束后 session才会执行写入和关闭操作 (看session1.php 结论), session一直被锁定了因此执行session3.php 时会发现 一直处于阻塞状态。 */session_start();$_SESSION['uname'] = 'lily';//当有session写入时会阻塞sleep(20);/*//如果用以下代码 就没问题了, 立即提交 写入关闭session_start();$_SESSION['uname'] = 'lemon';session_commit();sleep(20);*/session3.php 文件<?phpsession_start();echo $_SESSION['uname'];总结://可以用 session_commit (别名 session_write_close) 立即执行写入关闭 /*session_start();$_SESSION['aaaa'] = 1000;session_commit(); //执行commit后,直接会调用,wirte,close操作*//*1.只读取session页面,建议打开后,就直接commit,这是$_SESSION变量已经生成了。2.有对session进行写入页面,建议修改完$_SESSION后,直接调用commit3.多次打开并且写入,这个不建议使用,比较打开文件,写入都是耗费时间的。如果能一次搞定的,就不要做多次了。 除非,中间执行很耗时的业务。后记:其实,使用完session,随手commit也不是坏事,养成习惯后。可以节省性能,减少服务器开销。是个不错选择!欢迎大家交流!*/
2023年08月10日
15 阅读
0 评论
0 点赞
2023-08-10
php 插入mongodb uuid类型
php 插入mongodb uuid类型 $luuid ='e4eaaaf2-d142-11e1-b3e4-080027620cdd'; //格式一定要正确 » RFC 4122. $uuid='0123456789abcdef'; $id = new \MongoDB\BSON\Binary($uuid,\MongoDB\BSON\Binary::TYPE_UUID);查mongodb的LUUID类型为以下代码: $luuid= str_replace("-","",$luuid); $id= new \MongoDB\BSON\Binary(hex2bin($luuid),\MongoDB\BSON\Binary::TYPE_OLD_UUID); $id=bin2hex($id); var_dump($id);luuid 转为uuid: $luuid=二进制字符 $id=bin2hex($luuid); $a = substr($id,6, 2).substr($id,4, 2).substr($id,2, 2).substr($id,0, 2); $b = substr($id,10, 2).substr($id,8, 2); $c = substr($id,14, 2).substr($id,12, 2); $d = substr($id,16, 16); $id = $a.$b.$c.$d; $id = substr($id,0, 8).'-'.substr($id,8, 4).'-'.substr($id,12, 4).'-'.substr($id,16, 4).'-'.substr($id,20, 12); var_dump($id);uuid与luuid互转:publicfunctionreplayLuuid($id,$type) { $id = str_replace("-","",$id); $a = substr($id,6, 2).substr($id,4, 2).substr($id,2, 2).substr($id,0, 2); $b = substr($id,10, 2).substr($id,8, 2); $c = substr($id,14, 2).substr($id,12, 2); $d = substr($id,16, 16); $id = $a.$b.$c.$d; if ($type =='to') { $id= new \MongoDB\BSON\Binary(hex2bin($id),\MongoDB\BSON\Binary::TYPE_OLD_UUID); }else{ $id = substr($id,0, 8).'-'.substr($id,8, 4).'-'.substr($id,12, 4).'-'.substr($id,16, 4).'-'.substr($id,20, 12); } return $id; }
2023年08月10日
13 阅读
0 评论
0 点赞
1
...
59
60
61
...
112