最近遇到的一些小问题 201711

1. Laravel

1. TokenMismatchException in VerifyCsrfToken.php

这个问题很常见,在html中添加 csrf_token 也无效的话,考虑以下解决方法:

1
2
sudo rm -rf storage/framework/sessions/*
sudo php artisan cache:clear

2. Tinker

database/factories/ModelFactory 里的写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$factory->define(App\User::class, function (Faker\Generator $faker) {
static $password;
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'mobile' => $faker->phoneNumber,
'password' => $password ?: $password = bcrypt('secret'),
'remember_token' => str_random(10),
'forum_id' => function () {
return factory(\App\Forum::class)->create()->id;
},
];
});

1
2
php artisan tinker
factory(App\User::class, 10)->create();

注意:修改代码后需退出再重新进

2. Mysql

1. 重置表格索引

1
alter table `files` auto_increment=1

2. mysql 选择出多个字段,按其中某个字段distinct

要通过count 和 group的组合来实现

1
select DISTINCT field_name, other_field_name_1, other_field_name_2, ... ,other_field_name_n, count(field_name) from table_name where where_conditions group by field_name

3. 月份实现

datediff 函数

1
select round(datediff(date1, date2)/30) from table_name;

4.正则

1
select * from acct_member where email regexp '^[0-9]{11}@virtualAccount.com$' limit 10

注意:\d 等在mysql不好用,替换成别的,如[0-9]+

5. mysql 连表更新数据

1
2
3
4
5
6
UPDATE p_order_article p
LEFT JOIN
acct_member a
ON p.username = a.email
SET p.user_id = a.uid
WHERE a.email<>'' and p.user_id=0

3. 前端

1. jquery-validation 验证 select 下拉框

需要使用自定义方法,网址

2. textarea

在使用表单中的textarea标签时,有以下需要注意的地方:

  • 去掉右侧滚动条:

    1
    <textarea style= "overflow:hidden;"> </textarea>
  • 去掉右下角的拖拽标记:

    1
    <textarea style= "resize:none;"> </textarea>
  • textarea文本域宽度和高度(width、height)自动适应变化处理

1
2
3
4
5
6
7
8
<!-- 控制宽度的自动适应 -->
<style type="text/css">
.comments {
width:100%;/*自动适应父布局宽度*/
overflow:auto;
word-break:break-all;/*在ie中解决断行问题(防止自动变为在一行显示,主要解决ie兼容问题,ie8中当设宽度为100%时,文本域类容超过一行时,当我们双击文本内容就会自动变为一行显示,所以只能用ie的专有断行属性“word-break或word-wrap”控制其断行)*/
}
</style>
1
2
3
4
5
6
7
<!-- 主要控制高度的自动适应 -->
<!-- 第一个是普通textarea -->
<textarea class="comments" rows="10" cols="10"> </textarea>
<!-- 以下两种方式都可以解决textarea行高自动适应类容的高度 -->
<textarea class="comments" rows=1 name=s1 cols=27 onpropertychange= "this.style.posHeight=this.scrollHeight "></textarea>
<textarea class="comments" style="height:expression((this.scrollHeight>150)?'150px':(this.scrollHeight+5)+'px');overflow:auto;"></textarea>

4. Linux & PHP

1. 查找大文件

1
find ./ -size +100M -exec ls -lh {} \;
  • 如果想直接删除大于50M的文件,使用命令

    1
    find ./ -size +50M -exec rm {} \;
  • 本目录下文件大小排序并取前十个

    1
    ls -lSh | head -10

这里有详细的教程和案例。

2. PHP的 file_exists = is_dir + is_file

它既可以判断文件是否存在,又可以判断目录是否存在。但这样一个全面的函数执行效率非常低,就像asp中request不指定是form,还是get,cookies,所以结论是:

  • 如果要判断目录是否存在,请用独立函数 is_dir(directory)
  • 如果要判断文件是否存在,请用独立函数 is_file(filepath)

is_file 只判断文件是否存在;
file_exists 判断文件是否存在或者是目录是否存在;
is_dir 判断目录是否存在;

查看手册,虽然这两个函数的结果都会被缓存,但是is_file却快了N倍。
还有一个值得注意的:
文件存在的情况下,is_file比file_exists要快N倍;
文件不存在的情况下,is_file比file_exists要慢;
结论是,file_exits函数并不会因为该文件是否真的存在而影响速度,但是is_file影响就大了。

3. Laravel 使用 model 方式取数据,标记为 deleted_at 的记录也取出来了,如何避免

1
2
3
4
5
6
7
8
9
<?php
namespace App;
use Illuminate\Database\Eloquent\Model as EloquentModel;
use Illuminate\Database\Eloquent\SoftDeletes;
class Model extends EloquentModel
public function __construct()
{
parent::__construct();
}

加入 parent::__contstruct(), 就可以了
这就带来一个问题, 每个Model 的 fillable 字段都要填一遍了
老老实实写 fillable吧 ,为了安全
其实删掉 construct 就好了,怪了(有待确认)

4. 修改php文件上传2M的限制

首先找到当前使用的PHP配置文件

1
2
which php.ini is being used
php -i|grep 'php.ini'

实践证明,这种方法不靠谱,最好的方法还是在页面中打印出 phpinfo(), 找到 Loaded Configuration File 即可

修改这几个参数,重启 php-fpm (service php-fpm restart

1
2
3
4
upload_max_filesize = 100M (php程序最大可以上传的附件值)
post_max_size = 100M (form表单POST类型上传的最大可以上传值)
memory_limit = 128M  (限制php程序运行时占用的内存大小最大为 128M)
max_execution_time = 0  (PHP程序执行时间,单位:秒 0代表不限制)

5. could not find driver

网页请求没有问题,而命令行中执行composer 或 artisan 都报这个错误

1
2
[Illuminate\Database\QueryException]
could not find driver

这个问题困扰了好几天
服务器装了多个PHP, 命令行 php -v 和网页 phpinfo() 输出的PHP版本竟然不一致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# which php
/usr/local/bin/php
# /usr/local/bin/php -r "phpinfo();" | grep "PHP Version"
PHP Version => 7.1.9
PHP Version => 7.1.9
# php -v
PHP 7.1.9 (cli) (built: Sep 8 2017 10:52:57) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
# /usr/local/bin/php -r "echo(PHP_BINDIR);"
/usr/local/php/bin

而在网页中,以上的输出结果为 PHP Version 7.1.11/usr/bin

解决方法: 修改环境变量,将命令行的PHP指向7.1.11 (未成功)

临时解决方法: 将目前所使用的PHP软链到所需的PHP版本(先将原来的php备份)

1
2
3
4
5
# which php
/usr/local/bin/php
# cd /usr/local/bin/
# ll | grep php
lrwxrwxrwx 1 root root 12 Nov 13 18:03 php -> /usr/bin/php*

修改/etc/profile文件使其永久性生效,并对所有系统用户生效,在文件末尾加上如下两行代码

1
2
export PHP_HOME=/usr/bin
export PATH=${PATH}:${PHP_HOME}

最后:执行 命令source /etc/profile或 执行点命令 ./profile使其修改生效,执行完可通过echo $PATH命令查看是否添加成功。

目前的解决方法:

1
/usr/bin/php /root/composer.phar update

终极解决方案:删掉所有PHP版本,重装一个,就一个。

1
yum remove php-common

6. nginx 配置

使用socket 连接代替http连接。

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
这一行必须要加入到 nginx 的配置文件中,详细见这里

3. 其他

1. sublime 正则替换

1
2
From:(\d{11})
To: "$1"

From 的每一块都需要加括号

2. hexo NODE_MODULE_VERSION 冲突

1
NODE_MODULE_VERSION 46. This version of Node.js requires NODE_MODULE_VERSION 51. Please try re-compiling or re-installing

I ran into same issue, after updating node 7.x.x.Rebuilding npm rebuild didn’t work either, so After, some digging I was able to resolved it by following:

1
2
3
cd `which hexo'/../..
rm -rvf node_modules
npm install

cd into your hexo-project

1
2
rm -rvf node_modules
npm install

文章目录
  1. 1. Laravel
    1. 1. TokenMismatchException in VerifyCsrfToken.php
    2. 2. Tinker
  2. 2. Mysql
    1. 1. 重置表格索引
    2. 2. mysql 选择出多个字段,按其中某个字段distinct
    3. 3. 月份实现
    4. 4.正则
    5. 5. mysql 连表更新数据
  3. 3. 前端
    1. 1. jquery-validation 验证 select 下拉框
    2. 2. textarea
  4. 4. Linux & PHP
    1. 1. 查找大文件
    2. 2. PHP的 file_exists = is_dir + is_file
    3. 3. Laravel 使用 model 方式取数据,标记为 deleted_at 的记录也取出来了,如何避免
    4. 4. 修改php文件上传2M的限制
    5. 5. could not find driver
    6. 6. nginx 配置
  5. 3. 其他
    1. 1. sublime 正则替换
    2. 2. hexo NODE_MODULE_VERSION 冲突
|