首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
183 阅读
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
篇文章
累计收到
31
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
786
篇与
的结果
2023-08-07
PHP 序列化变量的 4 种方法
PHP 序列化变量的 4 种方法序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。serialize和unserialize函数这两个是序列化和反序列化PHP中数据的常用函数。 $a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); //序列化数组 $s = serialize($a); echo $s; //输出结果:a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6:"banana";s:1:"c";s:7:"Coconut";} echo ''; //反序列化 $o = unserialize($s); print_r($o);当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。PHP代码$obj = array();//序列化$s = base64_encode(serialize($obj));//反序列化$original = unserialize(base64_decode($s));但是base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用。//定义一个用来序列化对象的函数 function my_serialize( $obj ) { return base64_encode(gzcompress(serialize($obj))); } //反序列化 function my_unserialize($txt) { return unserialize(gzuncompress(base64_decode($txt))); }json_encode 和 json_decode使用JSON格式序列化和反序列化是一个不错的选择:使用json_encode和json_decode格式输出要serialize和unserialize格式快得多。JSON格式是可读的。JSON格式比serialize返回数据结果小。JSON格式是开放的、可移植的。其他语言也可以使用它。$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); //序列化数组 $s = json_encode($a); echo $s; //输出结果:{"a":"Apple","b":"banana","c":"Coconut"} echo ''; //反序列化 $o = json_decode($s);在上面的例子中,json_encode输出长度比上个例子中serialize输出长度显然要短。var_export 和 evalvar_export 函数把变量作为一个字符串输出;eval把字符串当成PHP代码来执行,反序列化得到最初变量的内容。$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); //序列化数组 $s = var_export($a , true); echo $s; //输出结果: array ( 'a' => 'Apple', 'b' => 'banana', 'c' => 'Coconut', ) echo ''; //反序列化 eval('$my_var=' . $s . ';'); print_r($my_var);wddx_serialize_value 和 wddx deserializewddx_serialize_value函数可以序列化数组变量,并以XML字符串形式输出。$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); //序列化数组 $s = wddx_serialize_value($a); echo $s; //输出结果(查看输出字符串的源码):<header/>ApplebananaCoconut echo ''; //反序列化 $o = wddx_deserialize($s); print_r($o);//输出结果:Array ( [a] => Apple => banana 1 => Coconut )可以看出,XML标签字符较多,导致这种格式的序列化还是占了很多空间。结论上述所有的函数在序列化数组变量时都能正常执行,但运用到对象就不同了。例如json_encode序列化对象就会失败。反序列化对象时,unserialize和eval将有不同的效果。
2023年08月07日
13 阅读
0 评论
0 点赞
2023-08-07
PHP文件上传详解
PHP文件上传详解上传文件分为两个部分,HTML显示部分和PHP处理部分,HTML部分主要是让用户来选择所要上传的文件,然后通过PHP中的$_FILES,我们可以把文件上传到服务器的指定目录。先来看一下HTML部分。? 上传: 说明:form标答的action="upload.php"是指点击这个form中的submit的时候,这个上传命令会被发送到这个叫 upload.php的页面去处理。method="post"是指以post方式去送,enctype="multipart/form-data"属 性规定了在提交这个表单时要使用哪种内容类型,在表单需要二进制数据时,比如文件内容,请使用"multipart/form-data",如果要上传文 件,这个属性是必要的。input中的type="file"时,规定了应该把输入作为文件来处理,并且在input后面会有一个浏览的按钮。我们再来看一个PHP处理页面 upload.php?<?phpif($_FILES'myfile' !='') { if($_FILES'myfile' > 0) { echo "错误状态:" .$_FILES'myfile'; }else { move_uploaded_file($_FILES['myfile']['tmp_name'] ,"uploads/" .$FILES'myfile'); echo "alert(上传成功!);"; }}else{ echo "alert(请上传文件!);";}?>说明:在解释这篇代码前,我们有必要了解以下知识。$_FILES'myfile' 是指被上传文件的名称$_FILES'myfile' 是指被上传文件的类型$_FILES'myfile' 是指被上传文件的大小,单位为字节(B)$_FILES'myfile' 是指被上传文件存在服务器中的临时副本文件名称,文件被移动到指定目录后临文件将被自动消毁。$_FILES'myfile' 是指由文件上传中有可能出现的错误的状态码,关于各状态含义后在会说明。了解了这些,我们再来看一下upload.php的代码。首先,$_FILES['myfile']['name']中的myfile是指在上面HTML页面中上传文件标签的name值,根据这个我们才能知道我 们正在处理的文件是哪一个input提交过来的,然后再来判断一下 $_FILES'myfile' 不是否为空,根据这个我们可以知道用户有没有上传文件,从而执行不同的操作。如果上传了文件并且状态是0就说明上传成功,我们就可以用 move_uploaded_file方法把上传的文件存放到指定目录,上面这个例子是指把上传的文件移动到同目录下的uploads文件夹下,这个路径 是相对于这个PHP文件(既upload.php)的相对目录。比如,我们想把上传的文件移动到upload.php上一层叫user的文件夹中的话,我 们就可以这样写:move_uploaded_file($_FILES['myfile']['tmp_name'] , "../user/" . $FILES'myfile'),这种方法使用起来很方便、灵活,这样一个文件就被上传到服务器中了,可以打开服务器中的目录查看该 文件。允许用户上传文件是一个有巨大的安全风险的行为,因此,通常情况下,我们会对用户上传的文件做一些限制,比如常见的限制文件类型和文件大小,来看一下。?<?phpif($_FILES'myfile' !='') { if($_FILES'myfile' > 0) { echo "错误状态:" .$_FILES'myfile'; }else { if($_FILES['myfile']['type'] =='image/jpeg' or $_FILES'myfile' =='image/pjpeg' or $_FILES['myfile']['type'] =='image/gif' &&$_FILES'myfile' < 20480){ move_uploaded_file($_FILES['myfile']['tmp_name'] ,"uploads/" .$FILES'myfile'); echo "alert(上传成功!);"; }else { echo "alert(请上传小于2MB的jpeg或Gif类型的附件);"; } }}else { echo "alert(请上传文件!);";}?>从上面的代码可以看出,我们规定了上传的文件类型必须是jpeg或者Gif并且必须小于2MB的文件($_FILES'myfile'的默认单位是字节)这里必须提到的是,对于IE浏览器,它识别jpg文件的类型必须是 pjpeg,而对于 FireFox,则必须是 jpeg,因此,我们必须对jpeg和pjpeg都作判断。这样一来,我们可以限制用户上传的一些危险的比如木马或者病毒脚本,来保证了服务器的安全运行。现在,一个上传文件程序就基本成形了。但时在有些时候,考虑到用户体验,我们还可以对用户上传过程中发生的错误作出一些提醒,让用户明白是哪里出了问题,我们会对$_FILES['myfile']['error']作出一些说明,先来看一下在PHP中对$_FILES'myfile'常见6种状态的定义。?$_FILES'teacher_pic' = 1 文件大小超过了PHP.ini中的文件限制$_FILES'teacher_pic' = 2 文件大小超过了浏览器限制$_FILES'teacher_pic' = 3 文件部分被上传$_FILES'teacher_pic' = 4 没有找到要上传的文件$_FILES'teacher_pic' = 5 服务器临时文件夹丢失$_FILES'teacher_pic' = 5 文件写入到临时文件夹出错错误信息状态为1时说明上传的文件超过了php.ini中的文件大小限制,我们可以打开php.ini这个文件。来找一下; Maximum allowed size for uploaded files.upload_max_filesize = 2M我这里是在第516行,这一句说定义了PHP中上传文件的最大字节数,默认情况下是2MB,这个设置是PHP全局上传限 制,权限最高,即使$_FILES['myfile']['size']设为10MB,也只能上传2MB以下的文件。比如,在默认情况下,如果规 定$_FILES'myfile' < 10MB,在用户上传文件大于2MB的情况下,就会现在$_FILES['teacher_pic']['error'] = 1的情况,一般来说,我们须要把$_FILES'myfile'的值设定在upload_max_filesize值之下(设大了也 没用,呵呵)。当然,你完全可以把php.ini中的upload_max_filesize值调的更大,但实际应用中,我们考虑到服务器的负载能力,不 建议upload_max_filesize的值超过20MB,这样会造成网站附件增大,这在论坛社区上可以很明显的看出来。了解了这些,我们就可以对错误状态作出定义,我们再来完善一下代码,来看一下。?<?phpif($_FILES'myfile' !=''){ if($_FILES'myfile' > 0){ switch($_FILES'myfile'){ case 1: echo "文件大小超过了PHP.ini中的文件限制!"; break; case 2: echo "文件大小超过了浏览器限制!"; break; case 3: echo "文件部分被上传!"; break; case 4: echo "没有找到要上传的文件!"; break; case 5: echo "服务器临时文件夹丢失,请重新上传!"; break; case 6: echo "文件写入到临时文件夹出错!"; break; } }else { if($_FILES['myfile']['type'] =='image/jpeg' or $_FILES'myfile' =='image/pjpeg' or $_FILES['myfile']['type'] =='image/gif' &&$_FILES'myfile' < 20480) { move_uploaded_file($_FILES['myfile']['tmp_name'] ,"uploads/" .$FILES'myfile'); echo "alert(上传成功!);"; }else { echo "alert(请上传小于2MB的jpeg或Gif类型的附件);"; } }}else { echo "alert(请上传文件!);";}?>可以看出,我们使用了switch语句来对6种错状态作出定义,这样来下,在发生错误的时间,用户就会明白,是哪里出了问题。但是还有一种情况就是,用户上传的文件在指定的目录中已经存在,这里我们可以使用file_exists方法来判断一下:?<?phpif($_FILES'myfile' !=''){ if($_FILES'myfile' > 0){ switch($_FILES'myfile'){ case 1: echo "文件大小超过了PHP.ini中的文件限制!"; break; case 2: echo "文件大小超过了浏览器限制!"; break; case 3: echo "文件部分被上传!"; break; case 4: echo "没有找到要上传的文件!"; break; case 5: echo "服务器临时文件夹丢失,请重新上传!"; break; case 6: echo "文件写入到临时文件夹出错!"; break; } }else { if($_FILES['myfile']['type'] =='image/jpeg' or $_FILES'myfile' =='image/pjpeg' or $_FILES['myfile']['type'] =='image/gif' &&$_FILES'myfile' < 20480) { if (!file_exists("uploads/" .$_FILES"myfile")) move_uploaded_file($_FILES['myfile']['tmp_name'] ,"uploads/" .$FILES'myfile'); echo "alert(上传成功!);"; }else{ echo "alert(您上传的文件已经存在!);"; } }else { echo "alert(请上传小于2MB的jpeg或Gif类型的附件);"; } }}else { echo "alert(请上传文件!);";}?>我的个娘呀,终于写完了,一个完整的上传程序终于完成了,这只是上传文件最原始的方法,这样更容易自己理解,使用时大家可以考虑把它写成类现在我们再来总结一下上传中的逻辑判断顺吧。先判断是否上传文件如果有再来判断上传中是否出错如果出错,则提示出错信息如查没出错,再判断文件类型如果类型符合条件,再判断指定目录中有没有存在该文件如果没有就把该文件移至指定目录
2023年08月07日
10 阅读
0 评论
0 点赞
2023-08-07
crontab+php-cgi/php 定时执行PHP脚本
crontab+php-cgi/php 定时执行PHP脚本说到crontab ,一般是crontab+shell 组合来执行任务,在开发中可能有这类需要:每隔一段时间请求一个php页面。有这样的需求就得用到crontab了,稍微看了php命令行模式,网上搜索了相关资料,整理如下。在web根目录创建请求的脚本index.php 我的文件路径(根据安装路径不同有不同路径):/usr/local/webserver/htdosc/index.php创建crontab文件2.1 crontab -e2.2 * /usr/local/webserver/php/bin/php-cgi -q /usr/local/webserver/htdosc/index.php#编辑crond计划,每分钟请求index.php完成,以上步骤完成后,在我的电脑中能正常每分钟请求index.php注意事项:一. /usr/local/webserver/php/ 是我的php安装路径二. php-cgi 是php解析器(我的理解是这样,总感觉我理解的不对,希望大虾们指正),有些资料是用./bin/php,我电脑上就不能,所以用php-cgi,可能安装的方式不对吧。三. -q 是安静模式(某些资料中看到的)运行php脚本四. 有些资料是 把在index.php的首行添加#! /usr/local/webserver/php/bin/php -q ,并对index.php添加执行权限。我没有这样做,也能正常请求index.php 。方法不一样,道理一样吧!
2023年08月07日
12 阅读
0 评论
0 点赞
2023-08-07
PHP文件型缓存解决方案secache
PHP文件型缓存解决方案secache注: 前两天发现的东西, 不同于一般的PHP文件缓存实现手法. 写得不错.类似Memcahced, 单文件实现, 支持并发, 比传统分离小文件缓存方式性能提高一倍.由于缓存文件只有一个,PHP最大寻址能力是2G,过大会指针溢出, 所以只能支持1G的缓存.以下是官方网站的介绍secache是一个PHP编写的文件型缓存解决方案纯php实现, 无须任何扩展,支持php4 / 5使用lru算法自动清理过期内容可以安全用于多进程并发最大支持1G缓存文件使用hash定位,读取迅速项目及下载地址 : http://code.google.com/p/secache/secache使用方法require('../secache/secache.php');$cache = new secache;$cache->workat('cachedata');$key = md5('test'); //必须自己做hash,前4位是16进制0-f,最长32位。$value = '值数据'; //必须是字符串$cache->store($key,$value);if($cache->fetch($key,$return)){echo ''.$key.'=>'.$return.'';}else{echo 'Data get failed! '.$key.'';}
2023年08月07日
11 阅读
0 评论
0 点赞
2023-08-07
SPL spl_autoload_register与__autoload方法使用示例浅谈
SPL spl_autoload_register与__autoload方法使用示例浅谈最近在写一个框架,当然过程中借鉴了很多前辈的写框架的经验啦,哈哈。在谈到框架自动加载类的方面,我大概翻了一下,现在主流的框架系统都使用spl_autoload_register函数,而非__autoload函数。额。。。为毛不用__autoload呢????示例:function my_own_loader($classname){$class_file = strtolower($classname).".php";if (file_exists($class_file)){require_once($class_file);}}spl_autoload_register("my_own_loader");$a = new A();这里要注意的是:__autoload 方法在 spl_autoload_register 后会失效,因为 autoload_func 函数指针已指向 spl_autoload 方法可以通过下面的方法来把 _autoload 方法加入 autoload_functions listspl_autoload_register( '__autoload' );此外我们还可以使用我们自定义的加载方法:第一种函数式:function my_own_loader($classname){$class_file = strtolower($classname).".php";if (file_exists($class_file)){require_once($class_file);}}spl_autoload_register("my_own_loader");$a = new A();第二种类式:class Loader{public static function my_own_loader($classname){$class_file = strtolower($classname).".php";if (file_exists($class_file)){require_once($class_file);}}}// 通过数组的形式传递类和方法的名称spl_autoload_register(array("my_own_loader","Loader"));$a = new A();spl_autoload_register()函数应该是主流框架使用最多的也是非常核心的函数之一,可实现自动注册函数和类,实现类似__autoload() 函数功能,简化了类的调用与加载,提高了工作的效率。支持版本:PHP 5 >= 5.1.2至于效率问题。php手册上有如此之话:bool spl_autoload_register ([ callback $autoload_function ] )将函数注册到SPL __autoload函数栈中。如果该栈中的函数尚未激活,则激活它们。貌似他么指向同一个堆栈,效率上都是大哥二哥的问题,哈哈。。有兴趣的也可以具体去测试下。。
2023年08月07日
13 阅读
0 评论
0 点赞
1
...
131
132
133
...
158