PHP

nginx、php-fpm、php 错误日志的关系

nginx、php-fpm、php 三者的配置文件中都有 error_log 项,指定各自错误日志的保存路径。理论上它们三者的错误应该不会重合,即 nginx error_log 记录的是 nginx 进程自己的错误,php-fpm error_log 记录的是 php-fpm 进程自己的错误, php error_log 记录的是 php 脚本执行时候的错误。 用户访问 nginx […]

Laravel 6 – 从基本用户认证深入理解Laravel

启用Laravel的基本用户认证模块后,就会自动生成几个用户注册/登录/密码找回的页面。我们就来从这几个页面深入理解Laravel的用法。 1. 找到路由 这几个路由都由/routes/web.php文件中新增的Auth::routes(); 这一行注册的。 1.1 Facade 这个用法涉及到了Laravel的facade概念,facade是指用看起来像调用类的静态方法的语法(类名::静态方法)来调用容器中对应实例的同名公有方法的一种用法。 我们可以在/config/app.php的aliases数组中找到这个Auth别名,该别名指向实际的facade类‘Auth’ => Illuminate\Support\Facades\Auth::class, 所以在路由/routes/web.php中的Auth::routes()实际上就是Illuminate\Support\Facades\Auth::routes() 然后我们再去看这个…\Facades\Auth的代码。 class Auth extends Facade { protected static

Laravel 6 – 使用Laravel 6的用户认证“脚手架”

1. 创建laravel 6项目 在工作目录下执行如下命令,通过composer创建laravel项目。 composer create-project –prefer-dist laravel/laravel blog “6.*” 该命令会在当前工作目录下生成blog项目目录。整个目录结构如下,关于laravel项目目录结构的说明可以参考Laravel Docs 然后使用php artisan serve 启动网站服务,或者配置nginx来运行网站。 初始的网站只有两个路由,可以通过命令php artisan route:list 来检查路由。

Composer入门

1. 新建目录composer_test 后续的所有操作都在该目录下执行。所以现在该目录为空。 2. 使用Composer下载第一个包(monolog/monolog) 方法一 在当前目录下直接执行require命令: composer require monolog/monolog 。 该命令首先会在目录下寻找composer.json文件,如果没有的话则自动创建composer.json并将require的依赖包写入该文件。 然后再去composer源上下载所需要的依赖包,放到vendor目录下。 将依赖包的顶级命名空间与其源码目录的对应关系写入到/vendor/composer目录下的autoload_*文件中。 运行完命令后目录结构变成如下图所示。 /composer.json文件 是composer进行项目依赖管理的配置文件。 /composer.lock文件 是composer下载依赖包时候创建的文件,它记录了当前下载到的所有依赖包的版本。 /vendor目录

php木马

最近参加了一次网络攻防大赛的培训。学到了不少知识,挺好的。 php的一句话木马 <?php // 这是一个GET版本的木马 // 用法是 http://domain/cmdget.php?cmd=phpinfo();exit(); @eval($_GET['cmd']); ?> 上面这一句话就是一个php的木马。当然,木马的前提是要将这个php文件上传到你的web服务器中,并且可通过url访问才行。有很多web漏洞可能导致被上传木马,包括上传文件漏洞、sql漏洞等等。 解释一下上面这一句话: @符号,是php的错误控制符,放在任何表达式之前,该表达式可能产生的任何错误信息都被忽略掉。可以放可不放。 eval(code_str), eval函数把字符串参数code_str当作php代码来解析执行。 $_GET[‘cmd’]就很好解释了,就是获取url中的cmd查询字符串。 所以合起来的意思就是执行用户在url查询字符串cmd输入的语句。这个语句可以是任意合法的php语句。phpinfo(),exit()(加exit是因为有时候这一句话木马是注入到别的php文件里面的,为防止该文件的其他php语句打乱输出结果,直接执行完想要的命令就终止运行。)还有一个很重要的php语句system(cmd),可以执行系统指令,并输出结果。 所以,实用http://domain/cmdget.php?cmd=system(“ls -tl”);exit();就能得到在web服务器ls -tl命令同样的结果。这样就叫getShell了。

wnmp启停脚本

windows下启动mysql、php、nginx ::关闭回显 @echo off set WNMP_HOME=C:/wnmp set NGINX_HOME=C:/wnmp/nginx-1.14.0 set PHP_HOME=C:/wnmp/php-7.2.7-nts-Win32-VC15-x64 echo Starting mysql… set status=1 (tasklist|find /I "mysqld.exe" || set

POST提交数据的方式

最近第一次使用vuejs做前端,用axios库来做表单的提交,结果发现php后台的$_POST是一个空数组,无法获取提交过来的数据。 查了一下,发现这个前端POST提交数据的方式有关。 1. 默认的application/x-www-form-urlencoded方式 使用html原生的<form>标签,并且不设置enctype属性,那么表单数据就会默认以application/x-www-form-urlencoded方式提交。 <form action="doAction.php" method="post"> 名字: <input type="text" name="fname"> <input type="submit" value="提交"> </form> 这时候可以看一下请求头的Content-Type: 这样,在php后台使用$_POST就能得到用户提交的表单数据。echo $_POST[‘fname’]; 另外如果使用传统jquery的$.ajax来提交form表单,默认也是以application/x-www-form-urlencoded方式来提交,所以使用$.ajax时候经常要将表单变量$(“#form_name”)序列化(serilize)

坑,Laravel的cache系统与entrust与throttle

laravel默认是使用file做cache驱动的,但file与database驱动的cache无法支持tag,这就与我用到的entrust插件冲突了,所以改成了array作为cache系统的驱动。 后来想用throttle中间件的时候,发现throttle无效,一猜就是cache的问题,因为改用array做cache后,array其实相当于一次进程获得的内存空间开辟的一块数组,那么如果cache在这个数组里面,请求处理完后,这个数组已经没有啦!所以throttle根本不起作用。想了想最好的办法还是得换redis或者memcache做cache驱动,尤其在生产环境。  

Laravel框架 – 打印容器实例

初学laravel的时候,看到service provider这一块,一直纠结如何才能打印出容器内所有的service provider,因为光靠config/app.php文件,很难从alias看出其对应的service provider到底是哪个。后来才发现,其实在程序的任意地方(Application启动后),都可以通过 Container::getInstance()这个静态方法获取当前的Application实例。或者可以使用在全局helps.php中定义的的 app()方法来获取当前Application实例。 Route::get('/test', function () { dd(app()); // dd(Illuminate\Container\Container::getInstance()); }); 注意: 在laravel中打印变量尤其是“超大型”变量的时候,千万不要直接使用var_dump()。一来不直观,二来大型变量直接 var_dump可能会导致浏览器卡死(我猜应该是卡死在尝试将var_dump数据解析成dom上面)。=。=# 最好使用larave的全局函数dd()或者dump(),输出又美观,又不会卡死浏览器。 ps: 最好用dd吧,少用dump,今天发现一个bug,如果使用dump的话,会导致cookie操作失效=。=#

关于var_dump输出的#号

php中使用var_dump打印一个对象的时候,其输出包括对象名,对象包含的成员变量(成员变量个数),以及一个“#序号”。像这样: object(B)表示这个对象是一个类名为B的实例;(2)表示这个对象内部有2个成员变量,分别是’name’与’age’;但#2代表什么呢? 其实我个人感觉(我并没有找到确切的说明文档,这估计得去看看php内核了),php中新建一个对象(不包括int、string、array这些基本类型的实例)的时候,会将该对象放在某个内核数组中。而var_dump出来的这个#序号,就表示该对象在这个php内核数组中序号。不过这序号并不能代表该对象是第几个被创建的,举个例子: <?php class A { public $name; } class B { public $name; public $age; } // #1,此时内核中的对象数组长度为1

Scroll to Top