首页
关于
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
篇文章
累计收到
33
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
560
篇与
的结果
2023-08-15
php 函数汇总
字符串函数sprintf()是一个用于格式化字符串的函数。
2023年08月15日
34 阅读
0 评论
0 点赞
2023-08-12
PHP session创建过程,详解基于cookie的session机制
PHP session创建过程,详解基于cookie的session机制PHP session创建机制详解,PHP session是基于cookie的(一般是,如果客户端不支持cookie,则使用url query方式)。PHP创建session代码:<?php session_start(); $_SESSION['name'] = 'value'; ?>,用浏览器访问此文件,会生成一个Set-Cookie的http响应头,在客户端设置一个名字为“PHPSESSID” 的cookie.如图:打开F12的“应用”,查看已存在的cookie,则看到刚才已设置的cookie.再次刷新此php文件。可以看到响应头中已经没有了Set-Cookie头,此时,因为cookie中已经存在PHPSESSID的cookie.则后续将使用已经存在的PHPSESSID cookie.
2023年08月12日
19 阅读
0 评论
0 点赞
2023-08-12
PHP单文件路由类
PHP单文件路由类路由类Router.php<?phpclass Router { private $routes = []; private $routeCount = 0; public function addRoute($method, $url, $callback) { $this->routes[] = ['method' => $method, 'url' => $url, 'callback' => $callback]; $this->routeCount++; } public function doRouting() { $is_match=0; // I used PATH_INFO instead of REQUEST_URI, because the // application may not be in the root direcory // and we dont want stuff like ?var=value $reqUrl = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);//$_SERVER['PATH_INFO']; if ($reqUrl == null) { $reqUrl = ''; } $reqMet = $_SERVER['REQUEST_METHOD']; foreach ($this->routes as $route) { // convert urls like '/users/:uid/posts/:pid' to regular expression $patterns = array('/\[[a-zA-Z0-9\_\-\/]+\]/','/\[{[a-zA-Z0-9\_\-}]+\]/','/\[\/{[a-zA-Z0-9\_\-}]+\]/','/{[a-zA-Z0-9\_\-}]+/'); $replace = array('([a-zA-Z0-9\-\_\/]*)','([a-zA-Z0-9\-\_]*)','([a-zA-Z0-9\-\_\/]*)','([a-zA-Z0-9\-\_]+)'); // $pattern = "@^" . preg_replace('/\\\:[a-zA-Z0-9\_\-]+/', '([a-zA-Z0-9\-\_]+)', preg_quote($route['url'])) . "$@D"; $pattern = "@^" . preg_replace($patterns, $replace, $route['url']) . "$@D"; $matches = array(); // check if the current request matches the expression if (preg_match($pattern, $reqUrl, $matches)) { // remove the first match array_shift($matches); foreach ($matches as $key => $value) { if (empty($value)) { unset($matches[$key]); } } // call the callback with the matched positions as params if ($route['method'] !=='*' && $reqMet !=='HEAD' && ( !empty($route['method']) && !in_array($reqMet, explode(',', $route['method']))) ) { throw new Exception("405 Not Allowed"); } return call_user_func_array($route['callback'], $matches); } else { $is_match++; } } if ($is_match == $this->routeCount) { throw new Exception("404 Not Found"); } } } //autoload // spl_autoload_register(function ($class_name) { // require_once __DIR__ . '/' . str_replace('\\', '/', $class_name) . '.php'; // }); 路由配置文件config/route.php <?php return [ [ ['GET'], '/', [new App\Index, 'index'], ], [ ['GET'], '/search', [new App\Index, 'search'], ], [ ['GET'], '/tool-[id][/]', [new App\Index, 'tool'], ], [ ['GET'], '/tool-[id]', [new App\Index, 'tool'], ], [ ['GET'], '/category-[cid].html', [new App\Index, 'category'], ], [ ['PUT,GET'], '/hello', function () { echo 'Hello AmazePHP!'; }, ], [ ['GET'], '/hello2', 'callbackFunction', ], [ ['GET'], '/hello44.php', function () { include 'App/aaaaa.php'; }, ], [ ['GET'], '/hello3/[id]', [new App\Foo, 'bar'],////object, method ], [ ['GET'], '/a/[uid]/b[/pid]', ['App\myclass', 'say_hello'],//static method ], [ ['GET,POST'], '/users', function () { echo 'post AmazePHP'; }, ], [ ['*'], '/users/[uid]/posts/[pid]', function ($uid, $pid = 99) { var_dump($uid, $pid); }, ], ];使用方法index.php include 'lib/Router.php'; include 'config/route.php'; $router = new Router(); foreach (config('route') as $key => $value) { $router->addRoute($value[0][0], $value[1], $value[2]); } $router->doRouting();
2023年08月12日
16 阅读
0 评论
0 点赞
2023-08-12
PHP curl 携带cookie请求抓取源码,模拟登陆
PHP curl 携带cookie请求抓取源码,模拟登陆function request_url_data($data) #获取保存COOKIE { $cookieSuccess = __DIR__."/cookie.txt";#cookie保存文件地址 $data['user'] = '用户名'; $data['pwd'] = '密码'; $requesturl = 'http://GET登陆提交地址?'.http_build_query($data); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $requesturl); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieSuccess); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); $data=curl_exec($ch); curl_close($ch); return $data; } function get_list($requesturl)#携带COOKIE请求获取登陆后的内容 { $cookieSuccess = __DIR__."/cookie.txt"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $requesturl); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieSuccess); //使用上面获取的cookies curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); $data=curl_exec($ch); curl_close($ch); return $data; }
2023年08月12日
13 阅读
0 评论
0 点赞
2023-08-12
使用phpunit进行单元测试
使用phpunit进行单元测试本教程假定您使用 PHP 8.1 或 PHP 8.2。您将学习如何编写简单的单元测试以及如何下载和运行 PHPUnit.PHPUnit 10 的文档 在这。下载:可以用以下2种方法之一:1.PHP 存档 (PHAR)我们分发了一个 PHP存档(PHAR),其中包含使用PHPUnit 10所需的一切 。只需从这里 下载 并使其可执行:wget -O phpunit https://phar.phpunit.de/phpunit-10.phar ➜ chmod +x phpunit ➜ ./phpunit --version PHPUnit 10.0.0 by Sebastian Bergmann and contributors.2.Composer您可以使用 Composer 将 PHPUnit 作为本地、每个项目、开发时依赖项添加到您的项目中:➜ composer require --dev phpunit/phpunit ^10 ➜ ./vendor/bin/phpunit --version PHPUnit 10.0.0 by Sebastian Bergmann and contributors.上面显示的示例假定composer在您的$PATH上。您的 composer.json 应该看起来像这样:{ "autoload": { "classmap": [ "src/" ] }, "require-dev": { "phpunit/phpunit": "^10" } }代码src/Email.php<?php declare(strict_types=1); final class Email { private string $email; private function __construct(string $email) { $this->ensureIsValidEmail($email); $this->email = $email; } public static function fromString(string $email): self { return new self($email); } public function asString(): string { return $this->email; } private function ensureIsValidEmail(string $email): void { if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { throw new InvalidArgumentException( sprintf( '"%s" is not a valid email address', $email ) ); } } }测试代码tests/EmailTest.php<?php declare(strict_types=1); use PHPUnit\Framework\TestCase; final class EmailTest extends TestCase { public function testCanBeCreatedFromValidEmail(): void { $string = 'user@example.com'; $email = Email::fromString($string); $this->assertSame($string, $email->asString()); } public function testCannotBeCreatedFromInvalidEmail(): void { $this->expectException(InvalidArgumentException::class); Email::fromString('invalid'); } }测试执行:以下2种方法都可以:1.PHP 存档 (PHAR)➜ ./phpunit --bootstrap src/autoload.php tests PHPUnit 10.0.0 by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: 70 ms, Memory: 10.00MB OK (2 tests, 2 assertions)上面假设你已经下载了phpunit.phar并将其作为phpunit放入你的$PATH,并且src/autoload.php 是一个为要测试的类设置自动加载 的脚本。这样的脚本通常使用 phpab 等工具生成。--bootstrap src/autoload.php指示 PHPUnit 命令行测试运行程序在运行测试之前包含src/autoload.php.tests 指示 PHPUnit 命令行测试运行程序执行在 tests 目录的 *Test.php 源代码文件中声明的所有测试.2.Composer➜ ./vendor/bin/phpunit tests PHPUnit 10.0.0 by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: 70 ms, Memory: 10.00MB OK (2 tests, 2 assertions)上面假设 vendor/autoload.php(由 Composer 管理的自动加载器脚本)存在,并且能够加载 Email 类的代码。根据设置自动加载的方式,您可能需要立即运行composer dump-autoload。tests 指示 PHPUnit 命令行测试运行程序执行在 tests 目录的 Test.php 源代码文件中声明的所有测试.一些测试组件推荐:https://packagist.org/packages/mockery/mockeryphpunit/phpunitfakerphp/fakerhttps://github.com/phpstan/phpstanvimeo/psalmmikey179/vfsstreamrector/rector引用declare和strict_typesps:declare(strict_types=1);严格类型默认情况下,如果能做到的话,PHP将会强迫错误类型的值转为函数期望的标量类型。例如,一个函数的一个参数期望是string,但传入的是integer,最终函数得到的将会是一个string类型的值。可以基于每一个文件开启严格模式。在严格模式中,只有一个与类型声明完全相符的变量才会被接受,否则将会抛出一个TypeError。 唯一的一个例外是可以将integer传给一个期望float的函数。使用 declare 语句和strict_types 声明来启用严格模式https://blog.csdn.net/joshua317/article/details/121252625assertsame使用运算符检查身份报告由 if 标识的错误,如果两个变量的类型和值不同 或者 两个变量不引用同一对象 报错https://docs.phpunit.de/en/10.1/assertions.html#assertsame
2023年08月12日
16 阅读
0 评论
0 点赞
1
...
44
45
46
...
112