Deprecated
: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in
/www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php
on line
1057
首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
182 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
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
篇文章
累计收到
28
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
29
篇与
的结果
2023-08-07
十个PHP高级应用技巧
1.使用 ip2long() 和 long2ip() 函数来把 IP 地址转化成整型存储到数据库里。这种方法把存储空间降到了接近四分之一(char(15) 的 15 个字节对整形的 4 个字节),计算一个特定的地址是不是在一个区段内页更简单了,而且加快了搜索和排序的速度(虽然有时仅仅是快了一点)。 2.在验证 email 地址的时候使用 checkdnsrr() 函数验证域名是否存在。这个内置函数能够确认指定的域名能够解析成 IP 地址。该函数的PHP 文档的用户评论部分有一个简单的用户自定义函数,这个函数基于 checkdnsrr(),用来验证 email 地址的合法性。对于那些认为自己的 email 地址是 [url=mailto:“joeuser@wwwphp.net]“joeuser@wwwphp.net[/url]” 而不是 [url=mailto:“joeuser@php.net]“joeuser@php.net[/url]” 的家伙们,这个方法可以很方便的抓住他们。3.如果你使用的是 PHP 5 和 MySQL 4.1 或者更高的版本,考虑抛弃 mysql_ 系列函数改用改进版的 mysqli_ 系列函数。一个很好的功能就是你可以使用预处理语句,如果你在维护一个数据库密集型站点,这个功能能够加快查询速度。一些评估分数。4.学会爱上三元运算符。5.如果你在项目中感觉到有可复用的部分,在你写下一行代码前先看看 PEAR 中是否已经有了。很多 PHP 程序员都知道 PEAR 是一个很好的资源库,虽然还有很多程序员不知道。这个在线资源库包含了超过 400 个可以复用的程序片段,这些程序片段你可以立即用刀你的程序里。除非说你的项目真的是非常特别的,你总能找到帮你节省时间的 PEAR 包。(参见 PECL )6.用 highlight_file() 来自动的打印出格式化的很漂亮的源代码。如果你在留言板、IRC 这些地方寻求一个脚本的帮助的话,这个函数用起来非常的顺手。当然了,要小心不要意外的泄露出你的数据库连接信息和密码等。7.使用 error_reporting(0) 函数来防止用户看到潜在的敏感错误信息。在理想情况下,发布服务器应该在 php.ini 里完全禁止。但是如果你用的是一个共享的 web 服务器的话,你没有自己的 php.ini 文件,那么这种情况下你最好的选择就是在所有脚本的第一行前加上 error_reporting(0);(或者使用 require_once() 方法)。这就能够在出错的时候完全屏蔽敏感的 SQL 查询语句和路径名。8.在网数据库中存储很大的字符串之前使用 gzcompress() 和 gzuncompress() 来显式的压缩/解压字符串。这个 PHP 内置函数使用 gzip 算法,可以压缩普通文本达 90%。在我每次要读写 BLOB 类型的字段的时候都使用这些函数。唯一额例外就是当我需要全文检索的时候。9.通过“引用”传递参数的方法从一个函数中得到多个返回值。就像三元运算符一样,大部分受过正式编程训练的程序员都知道这个技巧。但是那些 HTML 背景大于 Pascal 背景的程序员都或多或少的有过这样的疑问“在仅能使用一次 return 的情况下,从一个函数里返回多个值?”答案就是在变量前加上一个 “&” 符号,通过“引用”传递而非“值”传递。10.完全理解“魔术引号”和 SQL 注入的危险性。我希望阅读到这里的开发者都已经很对 SQL 注入和了解了。不过我还是把这条列在这里,是因为这个确实有点难以理解。如果你还没有听说过这种说法,那么把今天剩下的时间都用来 Google、阅读吧。
2023年08月07日
17 阅读
0 评论
0 点赞
2023-08-07
再一次, 不要使用(include/require)_once
再一次, 不要使用(include/require)_once最近关于apc.include_once_override的去留, 我们做了几次讨论, 这个APC的配置项一直一来就没有被很好的实现过.在这里, 我想和大家在此分享下, 这个问题的原因, 以及对我们的一些启示.关于使用include还是include_once(以下,都包含require_once), 这个讨论很长了, 结论也一直有, 就是尽量使用include, 而不是include_once, 以前最多的理由的是, include_once需要查询一遍已加载的文件列表, 确认是否存在, 然后再加载.诚然, 这个理由是对的, 不过, 我今天要说的, 是另外一个的原因.我们知道, PHP去判断一个文件是否被加载, 是需要得到这个文件的opened_path的, 意思是说, 比如:<?php set_include_path("/tmp/:/tmp2/"); include_once("2.php"); ?>当PHP看到include_once "2.php"的时候, 他并不知道这个文件的实际路径是什么, 也就无法从已加载的文件列表去判断是否已经加载, 所以在include_once的实现中, 会首先尝试解析这个文件的真实路径(对于普通文件这个解析仅仅类似是检查getcwd和文件路径, 所以如果是相对路径, 一般是不会成功), 如果解析成功, 则查找EG(include_files), 如果存在则说明包含过了, 返回, 否则open这个文件, 从而得到这个文件的opened_path. 比如上面的例子, 这个文件存在于 "/tmp2/2.php".然后, 得到了这个opened_path以后, PHP去已加载的文件列表去查找, 是否已经包含, 如果没有包含, 那么就直接compile, 不再需要open file了.尝试解析文件的绝对路径, 如果能解析成功, 则检查EG(included_files), 存在则返回, 不存在继续打开文件, 得到文件的打开路径(opened path)拿opened path去EG(included_files)查找, 是否存在, 如果存在则返回, 不存在继续编译文件(compile_file)这个在大多数情况下, 不是问题, 然而问题出在当你使用APC的时候...在使用APC的时候, APC劫持了compile_file这个编译文件的指针, 从而直接从cache中得到编译结果, 避免了对实际文件的open, 避免了对open的system call.然而, 当你在代码中使用include_once的时候, 在compile_file之前, PHP已经尝试去open file了, 然后才进入被APC劫持的compile file中, 这样一来, 就会产生一次额外的open操作. 而APC正是为了解决这个问题, 引入了include_once_override, 在include_once_override开启的情况下, APC会劫持PHP的ZEND_INCLUDE_OR_EVAL opcode handler, 通过stat来确定文件的绝对路径, 然后如果发现没有被加载, 就改写opcode为include, 做一个tricky解决方案.但是, 很可惜, 如我所说, APC的include_once_override实现的一直不好, 会有一些未定义的问题, 比如:<?php set_include_path("/tmp"); function a($arg = array()) { include_once("b.php"); } a(); a(); ?>然后, 我们的b.php放置在"/tmp/b.php", 内容如下:<?php class B {} ?>那么在打开apc.include_once_override的情况下, 连续访问就会得到如下错误:Fatal error - include() : Cannot redeclare class b(后记 2012-09-15 02:07:20: 这个APC的bug我已经修复: #63070)排除这些技术因素, 我也一直认为, 我们应该使用include, 而不是include_once, 因为我们完全能做到自己规划, 一个文件只被加载一次. 还可以借助自动加载, 来做到这一点.你使用include_once, 只能证明, 你对自己的代码没信心.所以, 建议大家, 不要再使用include_once
2023年08月07日
13 阅读
0 评论
0 点赞
2023-08-04
九个PHP很有用的功能
九个PHP很有用的功能下面是九个PHP中很有用的功能,不知道你用过了吗?1. 具有任意参数数量的函数您可能已经知道 PHP 允许您使用可选参数定义函数。但是还有一种方法可以允许完全任意数量的函数参数。首先,下面是一个只有可选参数的示例:// function with 2 optional arguments function foo($arg1 = '', $arg2 = '') {echo "arg1: $arg1\n"; echo "arg2: $arg2\n";}foo('hello','world');/* prints: arg1: hello arg2: world */foo();/* prints: arg1: arg2: */现在,让我们看看如何构建一个接受任意数量参数的函数。这次我们将利用func_get_args():// yes, the argument list can be empty function foo() {// returns an array of all passed arguments $args = func_get_args(); foreach ($args as $k => $v) { echo "arg".($k+1).": $v\n"; }}foo();/ prints nothing /foo('hello');/* prints arg1: hello */foo('hello', 'world', 'again');/* prints arg1: hello arg2: world arg3: again */2. 使用 glob() 查找文件许多 PHP 函数都有很长的描述性名称。但是,可能很难说出名为glob()的函数的作用,除非您已经从其他地方熟悉该术语。把它想象成 scandir() 函数的更强大的版本。它可以让您使用模式搜索文件。// get all php files $files = glob('*.php');print_r($files);/* output looks like: Array ( [0] => phptest.php [1] => pi.php [2] => post_output.php [3] => test.php ) */您可以获取多种文件类型,如下所示:// get all php files AND txt files $files = glob('*.{php,txt}', GLOB_BRACE);print_r($files);/* output looks like: Array ( [0] => phptest.php [1] => pi.php [2] => post_output.php [3] => test.php [4] => log.txt [5] => test.txt ) */请注意,文件实际上可以使用路径返回,具体取决于您的查询:$files = glob('../images/a*.jpg');print_r($files);/* output looks like: Array ( [0] => ../images/apple.jpg [1] => ../images/art.jpg ) */如果你想获取每个文件的完整路径,你可以对返回的值调用 realpath() 函数:$files = glob('../images/a*.jpg');// applies the function to each array element $files = array_map('realpath',$files);print_r($files);/* output looks like: Array ( [0] => C:\wamp\www\images\apple.jpg [1] => C:\wamp\www\images\art.jpg ) */3. 内存使用信息通过观察脚本的内存使用情况,您可以更好地优化代码。PHP有一个垃圾收集器和一个相当复杂的内存管理器。脚本使用的内存量。可以在脚本执行期间上下移动。要获取当前的内存使用情况,我们可以使用 memory_get_usage() 函数,并且要获得在任何时候使用的最高内存量,我们可以使用 memory_get_peak_usage() 函数。echo "Initial: ".memory_get_usage()." bytes \n";/* prints Initial: 361400 bytes */// let's use up some memory for ($i = 0; $i < 100000; $i++) {$array []= md5($i);}// let's remove half of the array for ($i = 0; $i < 100000; $i++) {unset($array[$i]);}echo "Final: ".memory_get_usage()." bytes \n";/* prints Final: 885912 bytes */echo "Peak: ".memory_get_peak_usage()." bytes \n";/* prints Peak: 13687072 bytes */4. CPU 使用率信息为此,我们将使用 getrusage() 函数。请记住,这在 Windows 平台上不可用。print_r(getrusage());/* prints Array ( [ru_oublock] => 0 [ru_inblock] => 0 [ru_msgsnd] => 2 [ru_msgrcv] => 3 [ru_maxrss] => 12692 [ru_ixrss] => 764 [ru_idrss] => 3864 [ru_minflt] => 94 [ru_majflt] => 0 [ru_nsignals] => 1 [ru_nvcsw] => 67 [ru_nivcsw] => 4 [ru_nswap] => 0 [ru_utime.tv_usec] => 0 [ru_utime.tv_sec] => 0 [ru_stime.tv_usec] => 6269 [ru_stime.tv_sec] => 0 ) */除非您已经拥有系统管理背景,否则这可能看起来有点神秘。以下是每个值的解释(您无需记住这些值):ru_oublock:块输出操作ru_inblock:块输入操作ru_msgsnd:发送的消息ru_msgrcv:收到的消息ru_maxrss:最大驻留集大小ru_ixrss:整体共享内存大小ru_idrss:整数非共享数据大小ru_minflt:页面回收ru_majflt:页面错误ru_nsignals:接收到的信号ru_nvcsw:自愿上下文切换ru_nivcsw:非自愿上下文切换ru_nswap:掉期ru_utime.tv_usec:用户使用时间(微秒)ru_utime.tv_sec:用户使用时间(秒)ru_stime.tv_usec:系统使用时间(微秒)ru_stime.tv_sec:系统使用时间(秒)要查看脚本消耗了多少 CPU 功率,我们需要查看“用户时间”和“系统时间”值。默认情况下,秒和微秒部分是单独提供的。您可以将微秒值除以 1 万,然后将其添加到秒值中,以十进制数的形式获得总秒数。让我们看一个例子:// sleep for 3 seconds (non-busy) sleep(3);$data = getrusage();echo "User time: ".($data['ru_utime.tv_sec'] + $data['ru_utime.tv_usec'] / 1000000);echo "System time: ".($data['ru_stime.tv_sec'] + $data['ru_stime.tv_usec'] / 1000000);/* prints User time: 0.011552 System time: 0 */尽管脚本运行大约需要 3 秒,但 CPU 使用率非常低。因为在睡眠操作期间,脚本实际上并不消耗 CPU 资源。还有许多其他任务可能需要实时时间,但可能不会占用 CPU 时间,例如等待磁盘操作。如您所见,CPU 使用率和运行时的实际长度并不总是相同的。这是另一个例子:// loop 10 million times (busy) for($i=0;$i<10000000;$i++) {}$data = getrusage();echo "User time: ".($data['ru_utime.tv_sec'] + $data['ru_utime.tv_usec'] / 1000000);echo "System time: ".($data['ru_stime.tv_sec'] + $data['ru_stime.tv_usec'] / 1000000);/* prints User time: 1.424592 System time: 0.004204 */这花费了大约 1.4 秒的 CPU 时间,几乎所有时间都是用户时间,因为没有系统调用。系统时间是 CPU 代表程序对内核执行系统调用所花费的时间。下面是一个示例:$start = microtime(true);// keep calling microtime for about 3 seconds while(microtime(true) - $start < 3) {}$data = getrusage();echo "User time: ".($data['ru_utime.tv_sec'] + $data['ru_utime.tv_usec'] / 1000000);echo "System time: ".($data['ru_stime.tv_sec'] + $data['ru_stime.tv_usec'] / 1000000);/* prints User time: 1.088171 System time: 1.675315 */现在我们有相当多的系统时间使用。这是因为脚本多次调用 microtime() 函数,该函数通过操作系统执行请求以获取时间。此外,您可能会注意到这些数字加起来不超过 3 秒。这是因为服务器上可能还有其他进程,并且脚本在 100 秒的整个持续时间内没有使用 3% CPU。5. 魔术常数PHP 提供了有用的魔术常量,用于获取当前行号 ()、文件路径 ()、目录路径 ()、函数名称 ()、类名 ()、方法名 (__METHOD__) 和命名空间 ()。__LINE____FILE____DIR____FUNCTION____CLASS____NAMESPACE__我们不会在本文中逐一介绍其中的每一个,但我会向您展示一些用例。当包含其他脚本时,最好使用常量(或者,从 PHP 5.3 开始):__FILE____DIR__// this is relative to the loaded script's path // it may cause problems when running scripts from different directories require_once('config/database.php');// this is always relative to this file's path // no matter where it was included from require_once(dirname(__FILE__) . '/config/database.php');使用使调试更容易。您可以跟踪行号:__LINE__// some code // ... my_debug("some debug message", __LINE__);/* prints Line 4: some debug message */// some more code // ... my_debug("another debug message", __LINE__);/* prints Line 11: another debug message */function my_debug($msg, $line) {echo "Line $line: $msg\n";}6. 生成唯一 ID在某些情况下,可能需要生成唯一的字符串。我见过很多人为此使用该功能,即使它并不完全是为此目的:md5()// generate unique string echo md5(time() . mt_rand(1,1000000));实际上有一个名为uniqid()的PHP函数用于此目的。// generate unique string echo uniqid();/* prints 4bd67c947233e */// generate another unique string echo uniqid();/* prints 4bd67c9472340 */您可能会注意到,即使字符串是唯一的,它们对于前几个字符看起来也很相似。这是因为生成的字符串与服务器时间相关。这实际上有一个很好的副作用,因为每个新生成的 id 都按字母顺序稍后出现,因此可以对它们进行排序。为了减少获得重复项的机会,您可以传递前缀或第二个参数来增加熵:// with prefix echo uniqid('foo_');/* prints foo_4bd67d6cd8b8f */// with more entropy echo uniqid('',true);/* prints 4bd67d6cd8b926.12135106 */// both echo uniqid('bar_',true);/* prints bar_4bd67da367b650.43684647 */此函数将生成比 更短的字符串,这也将为您节省一些空间。md5()7. 序列化您是否曾经需要在数据库或文本文件中存储复杂变量?您不必想出一个花哨的解决方案来将数组或对象转换为格式化字符串,因为 PHP 已经具有用于此目的的函数。序列化变量有两种常用方法。下面是一个使用 serialize() 和 unserialize() 的示例:// a complex array $myvar = array('hello', 42, array(1,'two'), 'apple');// convert to a string $string = serialize($myvar);echo $string;/* prints a:4:{i:0;s:5:"hello";i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:"two";}i:3;s:5:"apple";} */// you can reproduce the original variable $newvar = unserialize($string);print_r($newvar);/* prints Array ( [0] => hello [1] => 42 [2] => Array ( [0] => 1 [1] => two ) [3] => apple ) */这是本机 PHP 序列化方法。但是,由于JSON近年来变得如此流行,他们决定在PHP 5.2中添加对它的支持。现在你也可以使用 和 函数:json_encode()json_decode()// a complex array $myvar = array('hello', 42, array(1,'two'), 'apple');// convert to a string $string = json_encode($myvar);echo $string;/* prints ["hello",42,[1,"two"],"apple"] */// you can reproduce the original variable $newvar = json_decode($string);print_r($newvar);/* prints Array ( [0] => hello [1] => 42 [2] => Array ( [0] => 1 [1] => two ) [3] => apple ) */它更紧凑,最重要的是,与javascript和许多其他语言兼容。但是,对于复杂对象,某些信息可能会丢失。8. 压缩字符串在谈论压缩时,我们通常会考虑文件,例如 ZIP 存档。可以在PHP中压缩长字符串,而不涉及任何存档文件。在下面的示例中,我们将使用 gzcompress() 和 gzuncompress() 函数:$string ="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut elit id mi ultricies adipiscing. Nulla facilisi. Praesent pulvinar, sapien vel feugiat vestibulum, nulla dui pretium orci, non ultricies elit lacus quis ante. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam pretium ullamcorper urna quis iaculis. Etiam ac massa sed turpis tempor luctus. Curabitur sed nibh eu elit mollis congue. Praesent ipsum diam, consectetur vitae ornare a, aliquam a nunc. In id magna pellentesque tellus posuere adipiscing. Sed non mi metus, at lacinia augue. Sed magna nisi, ornare in mollis in, mollis sed nunc. Etiam at justo in leo congue mollis. Nullam in neque eget metus hendrerit scelerisque eu non enim. Ut malesuada lacus eu nulla bibendum id euismod urna sodales. ";$compressed = gzcompress($string);echo "Original size: ". strlen($string)."\n";/* prints Original size: 800 */echo "Compressed size: ". strlen($compressed)."\n";/* prints Compressed size: 418 */// getting it back $original = gzuncompress($compressed);我们能够实现近 50% 的尺寸减小。此外,函数 gzencode() 和 gzdecode() 通过使用不同的压缩算法获得了类似的结果。9. 寄存器关断功能有一个名为 register_shutdown_function() 的函数,它可以让您在脚本完成运行之前立即执行一些代码。假设您希望在脚本执行结束时捕获一些基准统计信息,例如运行所需的时间:// capture the start time $start_time = microtime(true);// do some stuff // ... // display how long the script took echo "execution took: ". (microtime(true) - $start_time). " seconds.";乍一看,这似乎微不足道。您只需将代码添加到脚本的最底部,它就会在完成之前运行。但是,如果您调用 exit() 函数,该代码将永远不会运行。此外,如果出现致命错误,或者脚本被用户终止(通过按浏览器中的“停止”按钮),它可能不会再次运行。使用 register_shutdown_function() 时,无论脚本停止运行的原因,代码都将执行:$start_time = microtime(true);register_shutdown_function('my_shutdown');// do some stuff // ... function my_shutdown() {global $start_time; echo "execution took: ". (microtime(true) - $start_time). " seconds.";}
2023年08月04日
17 阅读
0 评论
0 点赞
2023-08-04
PHP语法小记(一)
1,花括号“{}”可以像“[]”操作数组一样操作字符串,来获得指定位置的字符。2,PHP标签“<?php ?>”在独立PHP脚本内可以不写结束标签,这是为了避免意外的空格导致输出而报错。可以用注释来标明脚本结束。3,echo是语法结构,不是函数。后面跟多个字符串时用逗号“,”效率更好。4,数组中,1、'1'、true为索引的时候都会强制转换为1。而'01'不会进行转换,会按照字符串处理。5,将一个类的代码写在不同PHP标签内是不合法的,会报语法错误。而函数则没问题。6,session与cookie的区别与关系。session保存在服务器上,cookie保存在客户浏览器上;session保存可以是硬盘上的文件、数据库、memcached,cookie可以保存到硬盘(持久cookie)和内存里(会话cookie);session_id传递方式有两种,一是cookie,二是get方式(可以通过 session.name 配置项来指定保存session_id的变量名称)。7,获得当前时间戳用$_SERVER['REQUEST_TIME']代替time(),可以减少一次函数调用,效率更高。8,检查字符串是否超过某长度可以用isset($str{n})的语法代替strlen()函数,例如:判断$a的长度是否超过5,可以用isset($a{5})来判断。这样效率更高。9,header()函数过后要exit,否则后面代码还会执行。10,大数组用引用传递,减少内存占用,用完就unset()。11,数据库连接在使用的时候才建立,完全用完了记得关闭连接。12,set_time_limit()的局限性。只能限制脚本本身的运行时间,对于外部执行的时间无法控制,例如:system()函数,流操作,数据库查询等。13,abstract和interface的区别:abstract可以有非抽象方法,interface不行;abstract对方法的访问控制可以有protected,而interface必须为public;abstract只能被继承,当然一个类只能继承一个类,而一个类则可以实现多个interface。14,echo,print,print_r,var_dump,var_export的区别:echo,print是语法结构,不是函数,而且只能显示基本类型,不能显示数组和对象,其他都是函数,可以显示数组和对象;echo 可以显示多个变量,用逗号隔开;print_r第二个参数可以决定是输出变量,还是将变量作为返回值;var_dump会打印变量的详细信息,例如长度和类型,而且可以传递多个变量作为参数;var_export返回的是合法PHP代码格式。15,验证邮箱: filter_var($email, FILTER_VALIDATE_EMAIL);16,获取文件扩展名的方法:一,pathinfo($filename),取extension的值。二,end(explode('.',$filename))。17,文件锁定函数flock——的常量参数。共享锁(读取操作)——LOCK_SH独占锁(写入操作)——LOCK_EX释放锁(无论共享还是独占)——LOCK_UN防堵塞——LOCK_NB可以通过fclose()函数释放锁定操作。18,验证字符串是否是合法IP:不用正则,直接用ip2long(),合法则返回数字,不合法则返回false。19,PHP 5.3开始,可以使用__DIR__来获得当前脚本所在目录,不用再realpath(__FILE__)了。
2023年08月04日
15 阅读
0 评论
0 点赞
1
...
5
6