首页
关于
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基础
页面
关于
搜索到
786
篇与
的结果
2023-08-09
PHP & HTML5 文件夹上传
PHP & HTML5 文件夹上传拖拽上传文件夹到一个web应用程序。所以上传多个文件是一个有趣的了不起的进步。但是现在我提供给你 webkitdirectory !注意:这只会在一个最新的webkit的浏览器上运行。webkitdirectory目前不是标准 ,纯粹是为了玩。我不建议你在正式环境部署这个应用程序。I had the pleasure of having a little play around with this when I should have probablybeen working with processing for university but I do like to procrastinate。(此略)所以,干脆痛快:html 代码会员.jpg很简单,对吗?确实啊!上PHP代码。PHP 代码if($_FILES['file_input']){$uploads = UpFilesTOObj($_FILES['file_input']); $fileUploader=new FileUploader($uploads);}class FileUploader{public function __construct($uploads,$uploadDir='uploads/'){ foreach($uploads as $current) { $this->uploadFile=$uploadDir.$current->name.".".get_file_extension($current->name); if($this->upload($current,$this->uploadFile)){ echo "Successfully uploaded ".$current->name."n"; } } } public function upload($current,$uploadFile){ if(move_uploaded_file($current->tmp_name,$uploadFile)){ return true; } }}function UpFilesTOObj($fileArr){foreach($fileArr['name'] as $keyee => $info) { $uploads[$keyee]->name=$fileArr['name'][$keyee]; $uploads[$keyee]->type=$fileArr['type'][$keyee]; $uploads[$keyee]->tmp_name=$fileArr['tmp_name'][$keyee]; $uploads[$keyee]->error=$fileArr['error'][$keyee]; } return $uploads;}function get_file_extension($file_name){ return substr(strrchr($file_name,'.'),1);}我也一直在准备做MooTools脚本异步上传文件。所以请继续关注。我很高兴听到任何意见或建议。好运。更新:上传时保持目录结构 :所以最近我一直在玩很多新的文件API和一些图像处理等。在javascript中,我有巨大的乐趣这样做!我已经看到很多人问文件夹上传,这是一个令人兴奋的新发展。大多数人似乎有上传文件夹时保留文件结构的问题。在上传时是有可能保持文件夹的结构的。在写作时,我一直无法找到一个等价的不使用webkit的浏览器。这篇文章仅供测试!我正在写一个完整的AJAX文件夹上传脚本,但是我做时,我会去发一些我发现有趣的小代码片段。因此,闲话少说,上代码:未选择任何文件document.getElementById('files').onchange = function(e) { var files = e.target.files; // FileList for (var i = 0, f; f = files[i]; ++i)console.debug(files[i].webkitRelativePath);}检索路径是这么简单!这是一个工作示例:这是最基本的版本,将显示已提交的列表。fiddle是更复杂的比上面的代码让它不显示控制台什么的 。上传到服务器!事情开始变得稍微复杂,当我们上传这些到服务器时。我已经能够找到在撰写本文时,HTTP请求不支持上传时的变换文件路径。这可以很容易地通过我们自己添加它到请求数据解决。function uploadFiles(files){// Create a new HTTP requests, Form data item (data we will send to the server) and an empty string for the file paths. xhr = new XMLHttpRequest(); data = new FormData(); paths = ""; // Set how to handle the response text from the server xhr.onreadystatechange = function(ev){ console.debug(xhr.responseText); }; // Loop through the file list for (var i in files){ // Append the current file path to the paths variable (delimited by tripple hash signs - ###) paths += files[i].webkitRelativePath+"###"; // Append current file to our FormData with the index of i data.append(i, files[i]); }; // Append the paths variable to our FormData to be sent to the server // Currently, As far as I know, HTTP requests do not natively carry the path data // So we must add it to the request manually. data.append('paths', paths); // Open and send HHTP requests to upload.php xhr.open('POST', "upload.php", true); xhr.send(this.data);}This will simply create a triple hash delimited string which we will split into an array of file paths on the server which will correspond to our array of files。这将创建一个三重散列分隔的字符串,我们将分成数组服务器上的文件路径将对应于我们的一系列文件。0)$fileUploader = new FileUploader($_FILES); class FileUploader{public function __construct($uploads,$uploadDir='uploads/'){ // Split the string containing the list of file paths into an array $paths = explode("###",rtrim($_POST['paths'],"###")); // Loop through files sent foreach($uploads as $key => $current) { // Stores full destination path of file on server $this->uploadFile=$uploadDir.rtrim($paths[$key],"/."); // Stores containing folder path to check if dir later $this->folder = substr($this->uploadFile,0,strrpos($this->uploadFile,"/")); // Check whether the current entity is an actual file or a folder (With a . for a name) if(strlen($current['name'])!=1) // Upload current file if($this->upload($current,$this->uploadFile)) echo "The file ".$paths[$key]." has been uploadedn"; else echo "Error"; } } private function upload($current,$uploadFile){ // Checks whether the current file's containing folder exists, if not, it will create it. if(!is_dir($this->folder)){ mkdir($this->folder,0700,true); } // Moves current file to upload destination if(move_uploaded_file($current['tmp_name'],$uploadFile)) return true; else return false; }}?>进展这绝不是完美的,这是我一直在玩,并分享我的发现。我将会更新这篇文章当我有更多要发的东西。或者如果有特别令人兴奋的东西,我甚至可能发一篇新文章。所以现在,到这里下载源码 Folder-Upload-Structure-Sapphiondotcom
2023年08月09日
12 阅读
0 评论
0 点赞
2023-08-09
php 使用 ftp_nb_put() 来断点续传
php 使用 ftp_nb_put() 来断点续传<?php // 开始 $ret = ftp_nb_put ($my_connection, "test.remote", "test.local", FTP_BINARY, ftp_size("test.remote")); // 或: $ret = ftp_nb_put ($my_connection, "test.remote", "test.local", // FTP_BINARY, FTP_AUTORESUME); while ($ret == FTP_MOREDATA) { // 加入其它要执行的代码 echo "."; // 继续传送... $ret = ftp_nb_continue ($my_connection); } if ($ret != FTP_FINISHED) { echo "上传文件中发生错误..."; exit(1); } ?>
2023年08月09日
12 阅读
0 评论
0 点赞
2023-08-09
如何优雅的使用异常
如何优雅的使用异常老子曰:程序开发时,有 80% 的代码在处理各种异常。由于php实在是太过于灵活简单,很多phper对异常的处理其实不太感冒,于是乎,我们会经常看到die("xxx"); exit("xxx"); 这样的异常处理,但这类异常对于项目的稳定性却很不友好,主要有以下几点问题:1:粗暴的打断正常的业务流。2:调试非常因难。3:灵活度太差那我们展开来看这三个问题:1:现代的框架,大都有一个标准的处理流程:_before(); //前置控制器,可以做一个数据的初始化run(); //业务逻辑的处理_after(); //后置控制器,在处理完业务,有机会进行收尾(比如回收资源,统一打日志等)。但如果的 业务逻辑处理里(run)直接用 exit, die这类函数会直接退出php当前脚本的执行,从而跳过_after(),这显然不符合正常的逻辑。2:笔者曾经有个经历,打开某个页面,突然白屏,经过一翻苦苦的debug,终于在某处发现了一个孤零零的exit,没有任何提示,碰到这样的代码,对于调试者来说,就是个噩梦。3:现在已经不再是pc互联网的时候,移动互联网比例已大幅增加,这时,我们往往是输出一个接口,如果直接碰到exit, die这类输出可能直接导致客户端崩溃。那正确的使用方式是什么?没错,就是php自带的Exception, php自带的Exception非常的强大而且友好,可能由于历史原因,很多人没有习惯使用它。所以,针对第一个问题,我们在进行框架设计的时候,就可以这么处理:try { $ctrl->_before(); $ctrl->$method(); $ctrl->_after(); } catch (\Exception $e) { $ctrl->_atfer(); //让_after在异常后也能正常执行 throw $e; //再抛出异常 }抛出异常之后, 通过Exception类自带的 getTrace()方法,可以获得调用栈,这样就能很方便的进行调试。最后可以通过set_exception_handler自定义异常处理,最终输出正确的数据格式。帖上一小段我常用的异常处理代码。假定我们的api代码约定:{ code: 0, //非0表示异常 msg: "", //提示信息,非0时有值 data: {} //code=0时的业务数据, }自定义异常处理类<?php class MyException extends \Exception { public $realCode = ''; public function __construct($message, $code = -1) { $this->realCode = $code; parent::__construct($message, $code); } public static function exceptionHandler(\Exception $exception) { $model = ZFormater::exception($exception); //格式化异常 Log::info([\var_export($model, true)], 'exception'); //异常写日志 $info = array(); if(property_exists($exception, 'realCode')) { $codeArr = explode('_', $exception->realCode); if(count($codeArr) > 1) { $model['code'] = intval($codeArr[0]); $model['msg'] = $codeArr[1]; } } if ($config['debug_mode']) { //调式模式,输出调用栈 $info['debug'] = $model; } $info['msg'] = $model['message']; $info['ret'] = empty($model['code']) ? -1 : $model['code']; if(Request::isAjax()) { //ajax请求,json串输出 Request::setViewMode('Json'); } if('Php' == Request::getViewMode()) { //页面请求,统一的异常页面展示 if ($config['debug_mode']) { Request::setTplFile('public/exception.php'); } else { Request::setTplFile('public/error.php'); } } Response::display($info); } realCode对应的定义: <?php class ERROR { const DEF_MSG = '系统异常'; //系统级异常码 const PARAM_ERROR = '1_参数异常'; const NEED_LOGIN = '2_需要登录'; const USER_ERROR = '3_用户名不存在'; const PASS_ERROR = '4_密码异常'; }然后通过set_exception_handler("MyException::exceptionHandler"); 进行自定义异常处理后,我们在业务层,碰到异常的逻辑,就可以统一的、愉快的进行下面这样的异常抛出了:throw new MyException('param xxx error', ERROR::PARAM_ERROR);那么最终输出的api将会是:{ "code": 1, "msg": "参数异常" }这样就可以和exit, die 说再见了。PS: 以上代码大都取自zphp框架,详细可参考ZPHP框架: https://github.com/shenzhe/zphp
2023年08月09日
12 阅读
0 评论
0 点赞
2023-08-09
PHP程序员进阶学习书籍参考指南
PHP程序员进阶学习书籍参考指南【初阶】(基础知识及入门)《PHP与MySQL程序设计(第4版)》 http://item.jd.com/10701892.html《深入浅出MySQL 数据库开发 优化与管理维护 第2版》 http://item.jd.com/11381295.html《实战Nginx:取代Apache的高性能Web服务器》 http://dwz.cn/2K1ryn《Redis 实战》 http://item.jd.com/11791607.html《MongoDB权威指南 第2版》 http://item.jd.com/11384782.html《Linux系统命令及Shell脚本实践指南》 http://item.jd.com/11354663.html【中阶】(基本系统知识相关,可阅读类似书籍)《图解HTTP》 http://item.jd.com/11449491.html《图解TCP/IP 第5版》 http://item.jd.com/11253710.html《大话设计模式》 http://item.jd.com/10079261.html《大话数据结构》 http://item.jd.com/10663703.html《编译原理(第2版)》 http://item.jd.com/10058776.html《Linux C 编程一站式学习》 http://dwz.cn/2K1C3n《PHP应用程序安全编程》 http://dwz.cn/2K317p《高性能PHP应用开发》 http://dwz.cn/2K1kcy《PHP核心技术与最佳实践》 http://item.jd.com/11123177.html《高性能MySQL(第3版)》 http://item.jd.com/11220393.html《深入理解MariaDB与MySQL》 http://item.jd.com/11835700.html《构建高可用Linux服务器(第3版)》 http://item.jd.com/11557939.html【中高阶】(深入理解系统)《深入理解计算机系统(原书第2版)》 http://item.jd.com/10360906.html《现代操作系统(原书第3版)》 http://item.jd.com/10058893.html《数据库系统概念(原书第6版)》 http://item.jd.com/10954261.html《数据库系统实现(第2版)》 http://item.jd.com/10060181.html《UNIX环境高级编程(第3版)》 http://item.jd.com/11469694.html《UNIX网络编程 卷1 套接字联网API(第3版)》 http://item.jd.com/11728741.html《Linux高性能服务器编程》 http://item.jd.com/11252777.html【高阶】(深入理解服务原理)《深入理解PHP内核》 http://www.php-internals.com/book/《深入理解MySQL》 http://item.jd.com/10063042.html《MySQL技术内幕:InnoDB存储引擎(第2版)》 http://item.jd.com/11252326.html《深入剖析Nginx》 http://item.jd.com/11226514.html《深入理解Nginx:模块开发与架构解析》 http://item.jd.com/11217076.html《Redis设计与实现》 http://item.jd.com/11486101.html【架构及升级】(Web架构、分布式、云计算、机器学习等方向)《大规模Web服务开发技术》 http://dwz.cn/2K2o1d《大型分布式网站架构设计与实践》 http://item.jd.com/11529266.html《大型网站技术架构 核心原理与案例分析》 http://item.jd.com/11322972.html《大规模分布式系统架构与设计实战》 http://item.jd.com/11417660.html《大规模分布式存储系统:原理解析与架构实战》 http://item.jd.com/11310547.html《分布式系统:概念与设计(原书第5版)》 http://item.jd.com/11194499.html《Hadoop权威指南(第3版 修订版)》 http://item.jd.com/11566298.html《Cassandra权威指南》 http://item.jd.com/10794341.html《云计算架构技术与实践》 http://item.jd.com/11537731.html《OpenStack开源云王者归来》 http://item.jd.com/11521443.html《数据挖掘 概念与技术(原书第3版)》 http://item.jd.com/11056660.html《机器学习》 http://item.jd.com/10131321.html《图解机器学习》 http://item.jd.com/11676112.html《机器学习实战》 http://item.jd.com/11242112.html【番外篇】(可以参考延展学习)《深入PHP:面向对象、模式与实践(第3版)》 http://item.jd.com/10794350.html《Linux网络编程(第2版)》 http://item.jd.com/11397772.html《Linux多线程服务端编程 使用muduo C++网络库》 http://item.jd.com/11163782.html《Linux运维之道》 http://item.jd.com/11375254.html《Linux性能优化大师》 http://item.jd.com/11734651.html《PostgreSQL修炼之道:从小工到专家》 http://item.jd.com/11684063.html《图解网络硬件》 http://item.jd.com/11506709.html《网络安全基础:网络攻防、协议与安全》 http://item.jd.com/10550797.html《密码学原理与实践(第3版)》 http://item.jd.com/10067358.html《黑客大曝光:网络安全机密与解决方案(第7版)》 http://item.jd.com/11307435.html《黑客攻防技术宝典 Web实战篇 第2版》 http://item.jd.com/11020022.html《精通正则表达式(第3版)》 http://item.jd.com/11070361.html《Go语言编程》 http://item.jd.com/11067810.html《Python基础教程(第2版 修订版)》 http://item.jd.com/11461683.html《快学Scala》 http://item.jd.com/11113845.html《Erlang/OTP并发编程实战》 http://item.jd.com/11037265.html《函数式编程思维》 http://item.jd.com/11763847.html《Android从入门到精通》 http://item.jd.com/11078112.html《iOS开发指南》 http://item.jd.com/11681585.html《搜索引擎:信息检索实践》 http://item.jd.com/10059723.html《统计自然语言处理(第2版)》 http://item.jd.com/11314362.html《这就是搜索引擎:核心技术详解》 http://item.jd.com/10893803.html《Elasticsearch服务器开发(第2版)》 http://item.jd.com/11615450.html《实战Elasticsearch、Logstash、Kibana》 http://item.jd.com/11706768.html《推荐系统实践》 http://item.jd.com/11007625.html《机器学习实践指南:案例应用解析》 http://item.jd.com/11447036.html《Hadoop实战(第2版)》 http://item.jd.com/11116710.html《Hadoop大数据分析与挖掘实战》 http://item.jd.com/11837003.html《Spark大数据处理:技术、应用与性能优化》 http://item.jd.com/11577088.html《Spark机器学习》 http://item.jd.com/11763016.html
2023年08月09日
14 阅读
0 评论
0 点赞
2023-08-09
PHP AJAX JSONP实现跨域请求
PHP AJAX JSONP实现跨域请求代码示例:js代码<script> $.ajax({ type : "get",//get方法 async:false, url : "json.php", dataType : "jsonp", //类型 jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback) //jsonp回调参数,必需 jsonpCallback:"success_jsonpCallback",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名(如果一个页面有多个jsonp请求,请在这里起不同的名字) success:function(json){ alert(json); alert(json[0].aid); }, error:function(){ alert('fail'); } }); }); </script>**PHP代码:json.php **<?php $callback = $_GET['callback']; //jsonp回调参数,必需 $data=array(array('aid'=>22,'name'=>'张三','age'=>30)); echo $callback.'('.json_encode($data).')'; //返回格式,必需 ?>
2023年08月09日
11 阅读
0 评论
0 点赞
1
...
103
104
105
...
158