首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
184 阅读
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
篇文章
累计收到
32
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
786
篇与
的结果
2023-08-08
php错误及异常捕捉
php错误及异常捕捉在实际开发中,错误及异常捕捉仅仅靠try{}catch()是远远不够的。所以引用以下几中函数。a) set_error_handler一般用于捕捉 E_NOTICE 、E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE不能捕捉:E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR and E_COMPILE_WARNING。一般与trigger_error("...", E_USER_ERROR),配合使用。<?php// we will do our own error handlingerror_reporting(0);function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars){// timestamp for the error entry $dt = date("Y-m-d H:i:s (T)"); // define an assoc array of error string // in reality the only entries we should // consider are E_WARNING, E_NOTICE, E_USER_ERROR, // E_USER_WARNING and E_USER_NOTICE $errortype = array ( E_ERROR => 'Error', E_WARNING => 'Warning', E_PARSE => 'Parsing Error', E_NOTICE => 'Notice', E_CORE_ERROR => 'Core Error', E_CORE_WARNING => 'Core Warning', E_COMPILE_ERROR => 'Compile Error', E_COMPILE_WARNING => 'Compile Warning', E_USER_ERROR => 'User Error', E_USER_WARNING => 'User Warning', E_USER_NOTICE => 'User Notice', E_STRICT => 'Runtime Notice', E_RECOVERABLE_ERROR => 'Catchable Fatal Error' ); // set of errors for which a var trace will be saved $user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE); $err = "<errorentry>\n"; $err .= "\t<datetime>" . $dt . "</datetime>\n"; $err .= "\t<errornum>" . $errno . "</errornum>\n"; $err .= "\t<errortype>" . $errortype[$errno] . "</errortype>\n"; $err .= "\t<errormsg>" . $errmsg . "</errormsg>\n"; $err .= "\t<scriptname>" . $filename . "</scriptname>\n"; $err .= "\t<scriptlinenum>" . $linenum . "</scriptlinenum>\n"; if (in_array($errno, $user_errors)) { $err .= "\t<vartrace>" . wddx_serialize_value($vars, "Variables") . "</vartrace>\n"; } $err .= "</errorentry>\n\n"; echo $err;}function distance($vect1, $vect2) {if (!is_array($vect1) || !is_array($vect2)) { trigger_error("Incorrect parameters, arrays expected", E_USER_ERROR); return NULL; } if (count($vect1) != count($vect2)) { trigger_error("Vectors need to be of the same size", E_USER_ERROR); return NULL; } for ($i=0; $i<count($vect1); $i++) { $c1 = $vect1[$i]; $c2 = $vect2[$i]; $d = 0.0; if (!is_numeric($c1)) { trigger_error("Coordinate $i in vector 1 is not a number, using zero",E_USER_WARNING); $c1 = 0.0; } if (!is_numeric($c2)) { trigger_error("Coordinate $i in vector 2 is not a number, using zero",E_USER_WARNING); $c2 = 0.0; } $d += $c2*$c2 - $c1*$c1; } return sqrt($d);}$old_error_handle = set_error_handler("userErrorHandler");$t = I_AM_NOT_DEFINED; //generates a warning// define some "vectors"$a = array(2, 3, "foo");$b = array(5.5, 4.3, -1.6);$c = array(1, -3);//generate a user error$t1 = distance($c,$b);// generate another user error$t2 = distance($b, "i am not an array") . "\n";// generate a warning$t3 = distance($a, $b) . "\n";?>b) set_exception_handler设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常。 在 exception_handler 调用后异常会中止。与throw new Exception('Uncaught Exception occurred'),连用。<?php// we will do our own error handlingerror_reporting(0);function exceptHandle($errno, $errmsg, $filename, $linenum, $vars){// timestamp for the error entry $dt = date("Y-m-d H:i:s (T)"); // define an assoc array of error string // in reality the only entries we should // consider are E_WARNING, E_NOTICE, E_USER_ERROR, // E_USER_WARNING and E_USER_NOTICE $errortype = array ( E_ERROR => 'Error', E_WARNING => 'Warning', E_PARSE => 'Parsing Error', E_NOTICE => 'Notice', E_CORE_ERROR => 'Core Error', E_CORE_WARNING => 'Core Warning', E_COMPILE_ERROR => 'Compile Error', E_COMPILE_WARNING => 'Compile Warning', E_USER_ERROR => 'User Error', E_USER_WARNING => 'User Warning', E_USER_NOTICE => 'User Notice', E_STRICT => 'Runtime Notice', E_RECOVERABLE_ERROR => 'Catchable Fatal Error' ); // set of errors for which a var trace will be saved $err = "<errorentry>\n"; $err .= "\t<datetime>" . $dt . "</datetime>\n"; $err .= "\t<errornum>" . $errno . "</errornum>\n"; $err .= "\t<errortype>" . $errortype[$errno] . "</errortype>\n"; $err .= "\t<errormsg>" . $errmsg . "</errormsg>\n"; $err .= "\t<scriptname>" . $filename . "</scriptname>\n"; $err .= "\t<scriptlinenum>" . $linenum . "</scriptlinenum>\n"; if (1) { $err .= "\t<vartrace>" . wddx_serialize_value($vars, "Variables") . "</vartrace>\n"; } $err .= "</errorentry>\n\n"; echo $err;}$old_except_handle = set_exception_handler("exceptHandle");//$t = I_AM_NOT_DEFINED; //generates a warning$a;throw new Exception('Uncaught Exception occurred'); ?>c) register_shutdown_function执行机制是:php把要调用的函数调入内存。当页面所有PHP语句都执行完成时,再调用此函数。一般与trigger_error("...", E_USER_ERROR),配合使用。<?phperror_reporting(0);date_default_timezone_set('Asia/Shanghai');register_shutdown_function('my_exception_handler');$t = I_AM_NOT_DEFINED; //generates a warningtrigger_error("Vectors need to be of the same size", E_USER_ERROR); function my_exception_handler(){if($e = error_get_last()) { //$e['type']对应php_error常量 $message = ''; $message .= "出错信息:\t".$e['message']."\n\n"; $message .= "出错文件:\t".$e['file']."\n\n"; $message .= "出错行数:\t".$e['line']."\n\n"; $message .= "\t\t请工程师检查出现程序".$e['file']."出现错误的原因\n"; $message .= "\t\t希望能您早点解决故障出现的原因<br/>"; echo $message; //sendemail to }}?>c) restore_error_handler()函数定义和用法 restore_error_handler() 函数恢复之前的错误处理程序,该程序是由 set_error_handler() 函数改变的。该函数永远返回 true。是 set_error_handler()的反函数。
2023年08月08日
11 阅读
0 评论
0 点赞
2023-08-08
php全局异常/错误处理
php全局异常/错误处理php自有try{throw{}}catch{}异常/错误捕获系统,难以在生产环境中运用;生产环境中,我们一般要求,一旦出现异常/错误,php立刻结束脚本,向访客浏览器输出出错提示,并通过自定义函数向管理员发送消息以下就是php生产环境中的异常/错误处理方法工具/原料无方法/步骤在php代码开头处,增加代码:set_error_handler ( 'customerror' );这是php的常规错误捕获函数,一旦程序运行过程中出现常规错误,customerror()函数就会被调用;customerror()运行完毕,php程序继续运行,因此在customerror()函数中的最后一句,需要die(); 结束脚本customerror()有5个参数,这些参数会由set_error_handler()自动提供customerror()函数的具体书写形式:function customerror($error_level,$error_message,$error_file,$error_line,$error_context) {<--这里就是错误处理脚本-->die();//终止脚本}用set_exception_handler ( 'customexception' );捕获php运行过程中产生的第一个异常,因为该函数一旦捕获异常,就会停止执行脚本,因此只能捕获到第一个异常,捕获到异常后,会调用customexception()函数customexception()有一个参数,由set_exception_handler()自动提供customexception()函数的具体书写形式:function customexception($exception) {<--这里就是错误处理脚本-->}用register_shutdown_function('customend');这个不是用来处理错误的,这是一个在php脚本结束时自动调用一个函数的函数,因此我们可以利用它捕获能导致php脚本停止运行的严重错误(这类错误是不能被set_error_handler ()捕获的)一旦脚本停止运行,customend()函数就会被调用,在customend()函数中通过error_get_last()来判断脚本是正常结束还是发生严重错误而中断,如果是发生严重错误而中断,则运行错误处理程序customend()函数没有参数customend()函数的具体书写形式如下:function customend(){if(error_get_last()){<--这里就是错误处理脚本-->}}php全局异常/错误处理END注意事项set_error_handler () 还有第二个可省略参数,来确定低于哪个级别的错误不会被拦截
2023年08月08日
10 阅读
0 评论
0 点赞
2023-08-08
PHP开发者应了解的24个库
PHP开发者应了解的24个库作为一个PHP开发者,现在是一个令人激动的时刻。每天有许许多多有用的库分发出来,在Github上很容易发现和使用这些库。下面是我曾经遇到过最酷的24个库。你最喜欢的库没有在这个列表里面?那就在评论中分享吧!Dispatch – 微框架Dispatch是一个PHP小框架。它并没有给你完整的MVC设置,但你可以定义URL规则和方法,以便更好组织应用程序。这对API、简单的站点或原型来说是完美的。//包含库include 'dispatch.php';// 定义你的路由get('/greet', function () {//渲染视图render('greet-form');});//post处理post('/greet', function () {$name = from($_POST, 'name');// render a view while passing some localsrender('greet-show', array('name' => $name));});// serve your sitedispatch();你可以匹配特定类型的HTTP请求和路径,渲染视图或做更多事情。如果你合并Dispatch和其他框架,那你就可以拥有一个相当强大并且轻量级的程序!Klein – PHP快如闪电的路由Klein是另一款针对PHP5.3+版本的轻量级路由库。虽然它有一些比Dispatch冗长的语法,但它相当快。这有一个例子:respond('/[:name]', function ($request) {echo 'Hello ' . $request->name;});你也可以定制来指定HTTP方法和使用正则表达式作为路径。respond('GET', '/posts', $callback);respond('POST', '/posts/create', $callback);respond('PUT', '/posts/[i:id]', $callback);respond('DELETE', '/posts/[i:id]', $callback);//匹配多种请求方法:respond(array('POST','GET'), $route, $callback);//你或许也想在相同的地方处理请求respond('/posts/[create|edit:action] /[i:id] ', function ($request, $response) {switch ($request->action) {// do something}});对于小型项目来说这是很棒的,但当你把一个像这样的库用于大型应用时,你不得不遵守规矩,因为你的代码可能很快就变得不可维护。所以你最好搭配一个像Laravel或者CodeIgniter这样完全成熟的框架。Ham – 带缓存的路由库Ham也是一款轻量级的路由框架,但是它利用缓存甚至获得了更快的速度。它通过把任何I/O相关的东西缓存进XCache/APC。下面是一个例子:require '../ham/ham.php';$app = new Ham('example');$app->config_from_file('settings.php');$app->route('/pork', function($app) {return "Delicious pork.";});$hello = function($app, $name='world') {return $app->render('hello.html', array('name' => $name));};$app->route('/hello/<string>', $hello);$app->route('/', $hello);$app->run();这个库要求你至少安装了XCache和APC其中的一个,这可能意味着,在大多数主机提供商提供的主机上它可能用不了。但是如果你拥有一个安装它们其一的主机,或者你可以操控你的web服务器,你应该尝试这款最快的框架。Assetic – 资源管理Assetic是一个PHP的资源管理框架,用于合并和减小了CSS/JS资源。下面是例子。use Assetic\Asset\AssetCollection;use Assetic\Asset\FileAsset;use Assetic\Asset\GlobAsset;$js = new AssetCollection(array(new GlobAsset('/path/to/js/*'),new FileAsset('/path/to/another.js'),));//当资源被输出时,代码会被合并echo $js->dump();以这种方式合并资源是一个好主意,因为它可以加速站点。不仅仅总下载量减小了,也消除了大量不必要的HTTP请求(这是最影响页面加载时间的两件事)ImageWorkshop – 带层的图片处理ImageWorkshop是一个让你操控带层图片的开源库。借助它你可以重定义尺寸、裁剪、制作缩略图、打水印或做更多事情。下面是一个例子:// 从norway.jpg图片初始化norway层$norwayLayer = ImageWorkshop::initFromPath('/path/to/images/norway.jpg');// 从watermark.png图片初始化watermark层(水印层)$watermarkLayer = ImageWorkshop::initFromPath('/path/to/images/watermark.png');$image = $norwayLayer->getResult(); // 这是生成的图片!header('Content-type: image/jpeg');imagejpeg($image, null, 95); // We choose to show a JPG with a quality of 95%exit;ImageWorkshop被开发用于使一些PHP中最通用的处理图片的案例简化,如果你需要一些更强大的东西,你应该看下Imagine library!Snappy – 快照/PDF库Snappy是一个PHP5库,可以生成快照、URL、HTML、PDF。它依赖于wkhtmltopdf binary(在Linux,Windows和OSX上都可用)。你可以像这样使用它们:require_once '/path/to/snappy/src/autoload.php';use Knp\Snappy\Pdf;//通过wkhtmltopdf binary路径初始化库$snappy = new Pdf('/usr/local/bin/wkhtmltopdf');//通过把Content-type头设置为pdf来在浏览器中展示pdfheader('Content-Type: application/pdf');header('Content-Disposition: attachment; filename="file.pdf"');echo $snappy->getOutput('http://www.github.com');要记得,你的主机提供商可能不允许调用外部二进制程序。Idiorm – 轻量级ORM库Idiorm是个人之前在本网站教程中用过最喜爱的一款。它是一款轻量级的ORM库,一个建立在PDO之上的PHP5查询构造器。借助它,你可以忘记如何书写乏味的SQL:$user = ORM::for_table('user')->where_equal('username', 'j4mie')->find_one();$user->first_name = 'Jamie';$user->save();$tweets = ORM::for_table('tweet')->select('tweet.*')->join('user', array('user.id', '=', 'tweet.user_id'))->where_equal('user.username', 'j4mie')->find_many();foreach ($tweets as $tweet) {echo $tweet->text;}Idiorm有一个姊妹库叫Paris,Paris是一个基于Idiorm的Active Record实现。Underscore – PHP的工具腰带Underscore是原始Underscore.js的一个接口 – Javascript应用的工具腰带。PHP版本没有让人失望,而且支持了几乎所有原生功能。下面是一些例子:__::each(array(1, 2, 3), function($num) { echo $num . ','; }); // 1,2,3,$multiplier = 2;__::each(array(1, 2, 3), function($num, $index) use ($multiplier) {echo $index . '=' . ($num * $multiplier) . ',';});// prints: 0=2,1=4,2=6,__::reduce(array(1, 2, 3), function($memo, $num) { return $memo + $num; }, 0); // 6__::find(array(1, 2, 3, 4), function($num) { return $num % 2 === 0; }); // 2__::filter(array(1, 2, 3, 4), function($num) { return $num % 2 === 0; }); // array(2, 4)这个库也支持链式语法,这使得它更为强大。Requests – 简单HTTP请求Requests是一个简化HTTP请求的库。如果你和我一样,几乎从来都记不住传递给Curl的各种各样的参数,那么它就是为你准备的:$headers = array('Accept' => 'application/json');$options = array('auth' => array('user', 'pass'));$request = Requests::get('https://api.github.com/gists', $headers, $options);var_dump($request->status_code);// int(200)var_dump($request->headers['content-type']);// string(31) "application/json; charset=utf-8"var_dump($request->body);// string(26891) "[…]"借助这个库,你可以发送HEAD、GET、POST、PUT、DELTE和PATCH HTTP请求,你可以通过数组添加文件和参数,并且可以访问所有相应数据。Buzz – 简单的HTTP请求库Buzz是另一个完成HTTP请求的库。下面是一个例子:$request = new Buzz\Message\Request('HEAD', '/', 'http://google.com');$response = new Buzz\Message\Response();$client = new Buzz\Client\FileGetContents();$client->send($request, $response);echo $request;echo $response;因为它缺乏文档,所以你不得不阅读源码来获知它支持的所有参数。Goutte – Web抓取库Goutte是一个抓取网站和提取数据的库。它提供了一个优雅的API,这使得从远程页面上选择特定元素变得简单。require_once '/path/to/goutte.phar';use Goutte\Client;$client = new Client();$crawler = $client->request('GET', 'http://www.symfony-project.org/');//点击链接$link = $crawler->selectLink('Plugins')->link();$crawler = $client->click($link);//使用一个类CSS语法提取数据$t = $crawler->filter('#data')->text();echo "Here is the text: $t";Carbon – DateTime 库Carbon 是 DateTime API 的一个简单扩展。printf("Right now is %s", Carbon::now()->toDateTimeString());printf("Right now in Vancouver is %s", Carbon::now('America/Vancouver'));$tomorrow = Carbon::now()->addDay();$lastWeek = Carbon::now()->subWeek();$nextSummerOlympics = Carbon::createFromDate(2012)->addYears(4);$officialDate = Carbon::now()->toRFC2822String();$howOldAmI = Carbon::createFromDate(1975, 5, 21)->age;$noonTodayLondonTime = Carbon::createFromTime(12, 0, 0, 'Europe/London');$endOfWorld = Carbon::createFromDate(2012, 12, 21, 'GMT');//总是以UTC对比if (Carbon::now()->gte($endOfWorld)) {die();}if (Carbon::now()->isWeekend()) {echo 'Party!';}echo Carbon::now()->subMinutes(2)->diffForHumans(); // '2分钟之前'Ubench – 微型基准库Ubench 是一个用于评测PHP代码的微型库,可监控(代码)执行时间和内存使用率。下面是范例:use Ubench\Ubench;$bench = new Ubench;$bench->start();//执行一些代码$bench->end();//获取执行消耗时间和内存echo $bench->getTime(); // 156ms or 1.123secho $bench->getTime(true); // elapsed microtime in floatecho $bench->getTime(false, '%d%s'); // 156ms or 1secho $bench->getMemoryPeak(); // 152B or 90.00Kb or 15.23Mbecho $bench->getMemoryPeak(true); // memory peak in bytes 内存峰值echo $bench->getMemoryPeak(false, '%.3f%s'); // 152B or 90.152Kb or 15.234Mb//在结束标识处返回内存使用情况echo $bench->getMemoryUsage(); // 152B or 90.00Kb or 15.23Mb(仅)在开发时运行这些校验是一个好主意。Validation – 输入验证引擎Validation 声称是PHP库里最强大的验证引擎。但是,它能名副其实吗?看下面:use Respect\Validation\Validator as v;//简单验证$number = 123;v::numeric()->validate($number); //true//链式验证$usernameValidator = v::alnum()->noWhitespace()->length(1,15);$usernameValidator->validate('alganet'); //true//验证对象属性$user = new stdClass;$user->name = 'Alexandre';$user->birthdate = '1987-07-01';//在一个简单链中验证他的属性$userValidator = v::attribute('name', v::string()->length(1,32))->attribute('birthdate', v::date()->minimumAge(18));$userValidator->validate($user); //true你可以通过这个库验证你的表单或其他用户提交的数据。除此之外,它内置了很多校验,抛出异常和定制错误信息。Filterus – 过滤库Filterus是另一个过滤库,但它不仅仅可以验证,也可以过滤匹配预设模式的输出。下面是一个例子:$f = Filter::factory('string,max:5');$str = 'This is a test string';$f->validate($str); // false$f->filter($str); // 'This 'Filterus有很多内建模式,支持链式用法,甚至可以用独立的验证规则去验证数组元素。Faker – 假数据生成器Faker 是一个为你生成假数据的PHP库。当你需要填充一个测试数据库,或为你的web应用生成测试数据时,它能派上用场。它也非常容易使用://引用Faker 自动加载器require_once '/path/to/Faker/src/autoload.php';//使用工厂创建来创建一个Faker\Generator实例$faker = Faker\Factory::create();//通过访问属性生成假数据echo $faker->name; // 'Lucy Cechtelar';echo $faker->address;// "426 Jordy Lodge// Cartwrightshire, SC 88120-6700"echo $faker->text;// Sint velit eveniet. Rerum atque repellat voluptatem quia ...只要你继续访问对象属性,它将继续返回随机生成的数据。Mustache.php – 优雅模板库Mustache是一款流行的模板语言,实际已经在各种编程语言中得到实现。使用它,你可以在客户端或服务段重用模板。 正如你猜得那样,Mustache.php 是使用PHP实现的。$m = new Mustache_Engine;echo $m->render('Hello {{planet}}', array('planet' => 'World!')); // "Hello World!"建议看一下官方网站Mustache docs 查看更多高级的例子。Gaufrette – 文件系统抽象层Gaufrette是一个PHP5库,提供了一个文件系统的抽象层。它使得以相同方式操控本地文件,FTP服务器,亚马逊 S3或更多操作变为可能。它允许你开发程序时,不用了解未来你将怎么访问你的文件。use Gaufrette\Filesystem;use Gaufrette\Adapter\Ftp as FtpAdapter;use Gaufrette\Adapter\Local as LocalAdapter;//本地文件:$adapter = new LocalAdapter('/var/media');//可选地使用一个FTP适配器// $ftp = new FtpAdapter($path, $host, $username, $password, $port);//初始化文件系统$filesystem = new Filesystem($adapter);//使用它$content = $filesystem->read('myFile');$content = 'Hello I am the new content';$filesystem->write('myFile', $content);也有缓存和内存适配器,并且随后将会增加更多适配器。Omnipay – 支付处理库Omnipay是一个PHP支付处理库。它有一个清晰一致的API,并且支持数十个网关。使用这个库,你仅仅需要学习一个API和处理各种各样的支付处理器。下面是一个例子:use Omnipay\CreditCard;use Omnipay\GatewayFactory;$gateway = GatewayFactory::create('Stripe');$gateway->setApiKey('abc123');$formData = ['number' => '4111111111111111', 'expiryMonth' => 6, 'expiryYear' => 2016];$response = $gateway->purchase(['amount' => 1000, 'card' => $formData]);if ($response->isSuccessful()) {//支付成功:更新数据库print_r($response);} elseif ($response->isRedirect()) {//跳转到异地支付网关$response->redirect();} else {//支付失败:向客户显示信息exit($response->getMessage());}使用相同一致的API,可以很容易地支持多种支付处理器,或在需要时进行切换。Upload – 处理文件上传Upload是一个简化文件上传和验证的库。上传表单时,这个库会校验文件类型和尺寸。$storage = new \Upload\Storage\FileSystem('/path/to/directory');$file = new \Upload\File('foo', $storage);//验证文件上传$file->addValidations(array(//确保文件类型是"image/png"new \Upload\Validation\Mimetype('image/png'),//确保文件不超过5M(使用"B","K","M"或者"G")new \Upload\Validation\Size('5M')));//试图上传文件try {//成功$file->upload();} catch (\Exception $e) {//失败!$errors = $file->getErrors();}它将减少不少乏味的代码。HTMLPurifier – HTML XSS 防护HTMLPurifier是一个HTML过滤库,通过强大的白名单和聚集分析,保护你代码远离XSS攻击。它也确保输出标记符合标准。 (源码在github上)require_once '/path/to/HTMLPurifier.auto.php';$config = HTMLPurifier_Config::createDefault();$purifier = new HTMLPurifier($config);$clean_html = $purifier->purify($dirty_html);如果你的网站允许用户提交 HTML 代码,不修改就展示代码的话,那这时候就是用这个库的时候了。ColorJizz-PHP – 颜色操控库ColorJizz是一个简单的库,借助它你可以转换不同的颜色格式,并且做简单的颜色运算use MischiefCollective\ColorJizz\Formats\Hex;$red_hex = new Hex(0xFF0000);$red_cmyk = $hex->toCMYK();echo $red_cmyk; // 0,1,1,0echo Hex::fromString('red')->hue(-20)->greyscale(); // 555555它已经支持并且可以操控所有主流颜色格式了PHP Geo – 地理位置定位库phpgeo是一个简单的库,用于计算地理坐标之间高精度距离。例如:use Location\Coordinate;use Location\Distance\Vincenty;$coordinate1 = new Coordinate(19.820664, -155.468066); // Mauna Kea Summit 茂纳凯亚峰$coordinate2 = new Coordinate(20.709722, -156.253333); // Haleakala Summit$calculator = new Vincenty();$distance = $calculator->getDistance($coordinate1, $coordinate2); // returns 128130.850 (meters; ≈128 kilometers)它将在使用地理位置数据的app里出色工作。你可以试译 HTML5 Location API,雅虎的API(或两者都用,我们在weather web app tutorial中这样做了),来获取坐标。ShellWrap – 优美的命令行包装器借助 ShellWrap 库,你可以在PHP代码里使用强大的 Linux/Unix 命令行工具。require 'ShellWrap.php';use \MrRio\ShellWrap as sh;//列出当前文件下的所有文件echo sh::ls();//检出一个git分支sh::git('checkout', 'master');//你也可以通过管道把一个命令的输出用户另一个命令//下面通过curl跟踪位置,然后通过grep过滤’html’管道来下载example.com网站echo sh::grep('html', sh::curl('http://example.com', array('location' => true)));//新建一个文件sh::touch('file.html');//移除文件sh::rm('file.html');//再次移除文件(这次失败了,然后因为文件不存在而抛出异常)try {sh::rm('file.html');} catch (Exception $e) {echo 'Caught failing sh::rm() call';}当命令行里发生异常时,这个库抛出异常,所以你可以及时对之做出反应。它也可以通过管道让你一个命令的输出作为另一个命令的输入,来实现更强的灵活性。
2023年08月08日
13 阅读
0 评论
0 点赞
2023-08-08
用 thinkphp 查询 Oracle Spatial 的空间数据,实现LBS应用
用 thinkphp 查询 Oracle Spatial 的空间数据,实现LBS应用Oracle Spatial是Oracle公司推出的空间数据库组件,通过Oracle数据库系统存储和管理空间数据。ORACLE SPATIAL将所有的地理空间数据类型(矢量、栅格、网格、影像、网络、拓扑)统一在单一、开放的、基于标准的数据管理环境中, 这就减少了管理单独、分离的专用系统的成本、复杂性和开销原空间字段POSITION数据为:MDSYS.SDO_GEOMETRY(2001, null, MDSYS.SDO_POINT_TYPE(116.307111, 39.963784, null), null, null)此字段一定要建空间索引,SDO_WITHIN_DISTANCE 函数需要.建立空间索引语句: Create INDEX idxname on tablename(POSITION) Indextype is MDSYS.SPATIAL_INDEX;红色为SDO_SRID :几何的空间参考坐标系,不能为null,所有要改为8307.最终字段数据改为:MDSYS.SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(116.307111, 39.963784, null), null, null)更新语句:update tablename a set a.POSITION.sdo_srid=8307 where a.POSITION is not null查询此字段坐标语句为$sql = "select id,NAME, t.x, t.y from tablename , table(sdo_util.getvertices(tablename.POSITION)) t'"; $result=M()->query($sql);输出x,y为坐标。查询附近500米内的目标为$u_lon=116.3059818 $u_lat=39.963784 $sql=" SELECT id,NAME,rentcar,t.x, t.y, SDO_GEOM.SDO_DISTANCE ( POSITION, MDSYS.SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE($u_lon,$u_lat, null), null, null), 0.1 ) as meters FROM rablename, table(sdo_util.getvertices(tablename.POSITION)) t WHERE SDO_WITHIN_DISTANCE(POSITION,MDSYS.SDO_GEOMETRY(2001,8307,MDSYS.SDO_POINT_TYPE($u_lon,$u_lat,NULL),NULL,NULL),'DISTANCE=500 unit=M') = 'TRUE' ORDER BY SDO_GEOM.SDO_DISTANCE ( POSITION, MDSYS.SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE($u_lon,$u_lat, null), null, null), 0.1 ) "; $list = M()->query($sql);
2023年08月08日
9 阅读
0 评论
0 点赞
2023-08-08
Websocket介绍
WebSocket:是一种计算机通信协议,通过单个TCP连接提供全双工通信通道。IETF于 2011 年将 WebSocket 协议标准化为RFC 6455。当前允许 Web 应用程序使用该协议的 API 规范称为WebSockets。[1]它是由WHATWG维护的活跃标准,也是W3C的 WebSocket API的继承者。[2]WebSocket 与HTTP不同。这两种协议都位于OSI 模型的第 7 层,并依赖于第 4 层的 TCP。尽管它们不同,但RFC 6455声明 WebSocket“旨在通过 HTTP 端口 443 和 80 工作以及支持 HTTP 代理和中介” ,从而使其与 HTTP 兼容。为了实现兼容性,WebSocket握手使用HTTP Upgrade 标头将 HTTP 协议更改为 WebSocket 协议。与 HTTP轮询等半双工替代方案相比,WebSocket 协议支持Web 浏览器(或其他客户端应用程序)和Web 服务器之间的交互,从而促进与服务器之间的实时数据传输。这是通过为服务器提供一种标准化的方式来实现的,即无需客户端首先请求即可向客户端发送内容,并允许在保持连接打开的同时来回传递消息。通过这种方式,可以在客户端和服务器之间进行双向正在进行的对话。通信通信通常通过 TCP 端口号 443(在不安全连接的情况下为 80)完成,这对于使用防火墙阻止非 Web Internet 连接的环境很有用。大多数浏览器都支持该协议,包括Google Chrome、Firefox、Microsoft Edge、Internet Explorer、Safari和Opera。与 HTTP 不同,WebSocket 提供全双工通信。此外,WebSocket 在 TCP 之上启用消息流。TCP 单独处理字节流,没有固有的消息概念。在 WebSocket 之前,使用Comet通道可以实现 80 端口全双工通信;然而,Comet 的实现并不简单,而且由于 TCP 握手和 HTTP 标头开销,它对于小消息的效率很低。WebSocket 协议旨在在不损害 Web 安全假设的情况下解决这些问题。WebSocket 协议规范将ws(WebSocket) 和wss(WebSocket Secure) 定义为两个新的统一资源标识符(URI) 方案,分别用于未加密和加密连接。除了方案名称和片段(即#不支持),其余的 URI 组件被定义为使用URI 通用语法,示例: ws-URI = "ws:" "//" host [ ":" port ] path [ "?" query ] 或wss-URI = "wss:" "//" host [ ":" port ] path [ "?" query ].websocket服务端与客户端代码示例.用到了ws库.步骤:1安装wsnpm install ws步骤2:服务端代码:创建websocket.mjs文件,写入以下代码:import { WebSocketServer } from "ws"; const server = new WebSocketServer({ port: 3000 }); server.on("connection", (socket) => { // send a message to the client socket.send(JSON.stringify({ type: "hello from server", content: [ 1, "2" ] })); // receive a message from the client socket.on("message", (data) => { const packet = JSON.parse(data); switch (packet.type) { case "hello from client": console.log(packet.content) // ... break; } }); });运行服务端代码:node websocket.mjs步骤3:编写客户端代码:在目录中创建index.html写入以下代码:<html> <head> <meta charset="utf-8"> <title>HTML文档</title> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <script> const socket = new WebSocket("ws://localhost:3000"); socket.addEventListener("open", () => { // send a message to the server socket.send(JSON.stringify({ type: "hello from client", content: [ 3, "4" ] })); }); // receive a message from the server socket.addEventListener("message", ({ data }) => { const packet = JSON.parse(data); switch (packet.type) { case "hello from server": console.log(packet.content) // ... break; } }); </script> </body> </html>用浏览器打开index.html按f12查看console输出即可.参考更多 https://www.ruanyifeng.com/blog/2017/05/websocket.htmlhttps://www.cnblogs.com/chyingp/p/websocket-deep-in.htmlhttp://www.52im.net/thread-3713-1-1.htmlhttps://en.wikipedia.org/wiki/WebSockethttps://www.runoob.com/html/html5-websocket.htmlhttps://developer.mozilla.org/en-US/docs/Web/API/WebSockethttps://blog.p2hp.com/archives/4987
2023年08月08日
11 阅读
0 评论
0 点赞
1
...
120
121
122
...
158