首页
关于
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基础
页面
关于
搜索到
138
篇与
的结果
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 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 点赞
2023-08-09
PHP路由技术的原理与实践
PHP路由技术的原理与实践0×00 路由实现原理用户通过指定的URL范式对后台进行访问,URL路由处理类进行处理后,转发到逻辑处理类,逻辑处理类将请求结果返回给用户。约定URL范式和规则约定一套自己喜欢的,对搜索引擎友好,对用户友好的URL规则URL处理类(即路由实现的核心)对用户请求的URL进行解析处理,获取到用户请求的类,方法,以及Query参数等,并将请求转发给逻辑处理类。逻辑处理类处理网站的真实业务逻辑。0×01 URL范式约定目前来说,有两种比较流行的URL格式,一种是普通模式,一种是 pathinfo 模式。普通模式在 ThinkPHP 框架中,默认的URL格式即为普通模式,普通模式URL如下:index.php?m=home&c=user&a=login&v=value其中 m 参数的值为模块名称, c 参数的值为控制器名称, a 参数的值为方法名称,之后的参数则为该方法中所要接收的其他 GET 请求参数pathinfo模式在 CodeIgniter 框架中,默认的URL格式为 pathinfo 模式,如下:index.php/controller/method/prarme1/value1这块的意义也已经标注的很明白了,在 method 以后,就是方法接收的 GET 参数了,格式就是 名称/值0×02 URL路由处理类(核心)此处我们选用最简单的普通单模块模式进行演示,只为说明简单的原理,如下:index.php?c=user&a=login&v=value我们约定参数 c 为控制器名称,参数 a 为方法名称,之后的均是 GET 参数<?phpinclude 'index.class.php';include 'user.class.php';// 对用户请求URL进行处理$query = $_GET;$controller = isset($query['c']) ? $query['c'] : 'indexController';$action = isset($query['a']) ? $query['a'] : 'index';if (class_exists($controller)) {if (method_exists($controller, $action)) {unset($_GET['c']);unset($_GET['a']);// 实例化用户请求类并调用方法(new $controller())->$action();} else {echo '控制器' . $controller . '中不存在方法' . $action;}} else {echo '不存在控制器' . $controller;}其中 unset() 掉两个get参数,只是为了对真正调用的方法造成其他影响。0×03 逻辑处理类逻辑处理类就是最终的业务逻辑,也就是真正的回应用户请求的代码片段。下面只是一个简单的示例:/ index.class.php 文件源码 /<?phpclass indexController {public function index(){var_dump($_GET);}}/ user.class.php 文件源码 /<?phpclass user {public function index() {echo '这里是User控制器';}public function login() {var_dump($_GET);}}0×04 结束这里只是最简单的PHP路由技术的原理,其实真正为一个项目或者框架进行路由开发,可能需要能够兼容很多复杂的情况,需要对各种情况都要考虑到。
2023年08月09日
12 阅读
0 评论
0 点赞
2023-08-09
phalcon框架开发内容列表分页示例
phalcon框架开发内容列表分页示例<?php /** * phalcon框架内容列表示例 */ use Phalcon\Mvc\Model\Criteria; use Phalcon\Paginator\Adapter\QueryBuilder as PaginatorQueryBuilder; class ItvTopicController extends ControllerBase { /** * 主题列表 */ public function indexAction() { $numberPage = 1; if ($this->request->isPost()) { $query = Criteria::fromInput($this->di, "Topic", $_POST); $this->persistent->parameters = $query->getParams(); //获取搜索参数 } else { $numberPage = $this->request->getQuery("page", "int"); //取得页码 } if ($numberPage ==null) { $this->persistent->parameters = null; //如果页码为空,重置搜索参数 } $parameters = $this->persistent->parameters; if (!is_array($parameters)) { $parameters = array(); } if($this->request->getPost("topic")){ //搜索条件 $parameters["conditions"] .= " and topictype = 2 and status = 0"; //status:0正常,1删除 }else{ $parameters["conditions"] = "topictype = 2 and status = 0"; //status:0正常,1删除 } //传递 QueryBuilder 数据 $builder = $this->modelsManager->createBuilder() ->columns('*') ->from('Topic') //数据库 ->where($parameters['conditions'], $parameters['bind']) ->orderBy('id'); $paginator = new PaginatorQueryBuilder( array( "builder" => $builder, "limit" => 20, "page" => $numberPage ) ); $this->view->page = $paginator->getPaginate(); //获取分页数据 } } ?>
2023年08月09日
11 阅读
0 评论
0 点赞
1
...
21
22
23
...
28