avatar
Lialosiu's Note

laravel-mongo对不同类型同值的数据处理

最近敲代码的时候发现,laravel-mongo 在 ORM 的时候,如果用 save 更新一个值,类型不同但值相同,是不会写入 db 的…

举个栗子:

1
2
3
4
$data = new Data();
$data->_id = 1;
$data->a = 123;
$data->save();

那么mongo里面就是 a: int32 = 123

这时候如果再

1
2
3
$data = Data::find(1);
$data->a = '123';
$data->save();

问题就来了…

mongo 里面的值还特么的是 a: int32 = 123

并没有被更新成 a: string = '123'

但是如果是个不同类型不同值

1
2
3
$data = Data::find(1);
$data->a = '321';
$data->save();

就会被更新成 a: string = '321'

这个问题略蛋疼啊…

php-fpm配置的一个坑

调了一个下午,发现 php-fpm 有个怪坑

我在 docker 下,基于 php:7.0-fpm 镜像,构建了一个容器

并且 ADD ./app.pool.conf /usr/local/etc/php-fpm.d/ ,放了个 pool 进去

具体内容为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
user = www-data
group = www-data

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific address on
; a specific port;
; 'port' - to listen on a TCP socket to all addresses on a
; specific port;
; '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = 0.0.0.0:9000

; Choose how the process manager will control the number of child processes.
; Possible Values:
; static - a fixed number (pm.max_children) of child processes;
; dynamic - the number of child processes are set dynamically based on the
; following directives. With this process management, there will be
; always at least 1 children.
; pm.max_children - the maximum number of children that can
; be alive at the same time.
; pm.start_servers - the number of children created on startup.
; pm.min_spare_servers - the minimum number of children in 'idle'
; state (waiting to process). If the number
; of 'idle' processes is less than this
; number then some children will be created.
; pm.max_spare_servers - the maximum number of children in 'idle'
; state (waiting to process). If the number
; of 'idle' processes is greater than this
; number then some children will be killed.
; ondemand - no children are created at startup. Children will be forked when
; new requests will connect. The following parameter are used:
; pm.max_children - the maximum number of children that
; can be alive at the same time.
; pm.process_idle_timeout - The number of seconds after which
; an idle process will be killed.
; Note: This value is mandatory.
pm = dynamic

; The number of child processes to be created when pm is set to 'static' and the
; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'.
; This value sets the limit on the number of simultaneous requests that will be
; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP
; CGI. The below defaults are based on a server without much resources. Don't
; forget to tweak pm.* to fit your needs.
; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'
; Note: This value is mandatory.
pm.max_children = 20

; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 2

; The desired minimum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.min_spare_servers = 1

; The desired maximum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.max_spare_servers = 3

;---------------------

; Make specific Docker environment variables available to PHP
env[DB_1_ENV_MYSQL_DATABASE] = $DB_1_ENV_MYSQL_DATABASE
env[DB_1_ENV_MYSQL_USER] = $DB_1_ENV_MYSQL_USER
env[DB_1_ENV_MYSQL_PASSWORD] = $DB_1_ENV_MYSQL_PASSWORD

catch_workers_output = yes

然而…

php-fpm 一启动就报错

1
2
3
4
5
root@8ddf4ad1d3b6:/usr/local/etc/php-fpm.d# php-fpm
[05-Jul-2016 08:36:34] ERROR: [/usr/local/etc/php-fpm.d/applll.pool.conf:4] unknown entry 'user'
[05-Jul-2016 08:36:34] ERROR: Unable to include /usr/local/etc/php-fpm.d/applll.pool.conf from /usr/local/etc/php-fpm.conf at line 4
[05-Jul-2016 08:36:34] ERROR: failed to load configuration file '/usr/local/etc/php-fpm.conf'
[05-Jul-2016 08:36:34] ERROR: FPM initialization failed

研究了好几个钟头无果

瞎弄的时候把 app.pool.conf 重命名成了 aaa.pool.conf

神奇的发现, php-fpm 正常了

1
2
3
root@8ddf4ad1d3b6:/usr/local/etc/php-fpm.d# php-fpm
[05-Jul-2016 08:34:07] NOTICE: fpm is running, pid 188
[05-Jul-2016 08:34:07] NOTICE: ready to handle connections

然后测试了几个文件名,发现只要是 app 打头,都会造成 php-fpm 抽筋…目测是撞上了什么奇怪的规则

然而我 Google 搜了好久都没发现有人报告这个问题…_(:3」∠)_

嘛,自己记录一下吧.

Laravel 在极高的瞬间并发时出现的问题

又踩了了一个坑

之前曾经出现过 laravel 在极高的瞬间并发的时候,会出现session状态丢失的问题。原因是laravel中,session默认储存在文件系统,在瞬间并发时,可能由于文件系统io的原因,导致session文件读写失败,进而造成session丢失。

这个问题我当时是直接把session存放在cookie或者数据库中解决了。

然而今天又出现了新状况,也是瞬间高并发的锅。

如图,这是在ngjs下的一个并发上传的控件,会同时并发上传选择的文件,且在上传前会并发请求以查询文件是否已上传,以完成续传功能。

1秒内大概有15个并发连接

在这几个并发连接中,有部分会发生错误,扔我一脸500

具体报错是^

然而,我明显没设错mysql账号密码啦

而且我.env文件中数据库相关的设置是:

1
2
3
4
DB_HOST=localhost
DB_DATABASE=amaoto-core
DB_USERNAME=root
DB_PASSWORD=

然而报错是说我用了forge作为用户名连接mysql

等等,forge好熟悉啊

这货不就是laravel配置文件中的连mysql的默认用户名咩

检查config/database.php

1
2
3
4
5
6
7
8
9
10
11
'mysql' => [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST''localhost'),
        'database'  => env('DB_DATABASE''forge'),
        'username'  => env('DB_USERNAME''forge'),
        'password'  => env('DB_PASSWORD'''),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
    ],

果然

也就是说,env('DB_USERNAME', 'forge') 没能成功读取.env文件

参考之前session状态丢失的解决方法,那就不读取.env咯

然而不用.env的话,把数据库账密写在config/database.php也不科学

于是翻了翻文档

发现artisan指令:config:cache 可缓存配置文件

马上执行试试,重新测试一看,完美解决。

嘛,所以难得的更新了blog做个笔记ww

修复 Windows 10 中损坏的 Appx 应用

前段时间手贱把 Surface Pro 3 的 系统升级到了 Windows Indsider Fast Ring 通道的 10525 版本,然后发现 ChromeVirtual Box 都出现了兼容性问题,估计是新的内存管理机制的锅。

因为工作需要用到 Vagrant,Virtual Box 不能用简直不能忍,于是我滚回到了10240

然而没想到回滚完成后,好几个 Appx 应用都出问题了,应用名显示为 @{microsoft.windowscommunicationsapps_17.6120.42011.0_x64__8wekyb3d8bbwe} 类似这样的形式。

出问题的应用分别为 Edge、日历与邮件、应用商店、Cortana,其中 Edge 和 Cortana 只是名字没了Icon没了,商店则是变成了英文菜单,日历与邮件则是直接打开不能、更新不能、卸载不能、完全拿他没办法。

强行忍了一个多星期,实在受不了,于是昨天抽时间出来终于把这问题解决了,写下来记录下步骤 顺便给blog填点东西


首先,祭出最基本的 wsreset 大法,管理员运行,然而并没有什么卵用

试着跑了下系统自带的疑难解答,然而它提示说……

|д゚)

好咯,还是要自己动手

既然系统搞不定,那就自己来研究吧

管理员身份打开 Powershell,把所有包重新注册一遍

1
Get-AppXPackage | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocation)\AppXManifest.xml"}

坐等了大概一分钟,跑完了

跑完瞬间发现,Edge恢复正常了,那写坏掉的应用名也恢复正常了!

然而还是有两个坏掉的图标……

日历与邮件还是不行_(:3」∠)_

瞄了一眼 Powershell,发现有报错

咦,C:\ 在C盘根目录找是什么鬼

输出一下包信息看一下先:

1
Get-AppxPackage microsoft.windowscommunicationsapps*

妈了个鸡,为何 InstallLocation 不见了……

1
2
cd "C:\Program Files\WindowsApps\"
ls

妈了个蛋,还真没了这个文件夹……

存在的文件是 42011 然而包信息里面的是 42001

好吧,估计这个就是问题所在了……

试试移除掉这个包咯

1
Get-AppxPackage *microsoft.windowscommunicationsapps* | Remove-AppxPackage

然而并没有用,还是读的根目录

想了想,既然只会读根目录,那我就把 42011 的 AppXManifest.xml 扔在 C: 根目录总能读到了吧?

于是把整个 42011 的所有文件复制一份扔在根目录

然后试着:

1
Add-AppxPackage -register "C:\AppxManifest.xml" –DisableDevelopmentMode

有反应!但是依然是报错信息,说在 C:\ProgramData\Microsoft\Windows\AppRepository 里面找不到对应的xml

那我就复制一份进去咯

1
xcopy 'C:\AppxManifest.xml' microsoft.windowscommunicationsapps_17.6106.42001.0_x64__8wekyb3d8bbwe.xml

再试试看!

1
Add-AppxPackage -register "C:\AppxManifest.xml" –DisableDevelopmentMode

nice!成功运行!

打开开始菜单看看,邮件恢复了!

为了防止出现各种奇怪的问题,先把包砍了再从商店装一遍吧

然而并不能在GUI下直接卸载,那就老方法

1
Get-AppxPackage *microsoft.windowscommunicationsapps* | Remove-AppxPackage

ok,卸掉

然后商店重新安装

搞定 (´・ω・`)

Homestead 2.0.9 的一个坑

整个下午都在调戏 Laravel 5 和 Homestead,然后掉坑里了……记录一下

Homestead.yaml 配置文件中,folders列,如果要设置为当前路径,不能够这样:

1
2
3
folders:
- map: .
to: /home/vagrant/your-dir

而是要这样:

1
2
3
folders:
- map: ./
to: /home/vagrant/your-dir

就因为这尼玛的少了个斜杠 //vagrant 一直mount不了……

さくら、もゆ。-as the Night's, Reincarnation- 応援中!! さくら、もゆ。-as the Night's, Reincarnation- 応援中!! 「封緘のグラセスタ」応援中! 『縁りて此の葉は紅に』2018年1月26日発売予定! 『縁りて此の葉は紅に』2018年1月26日発売予定!