Laravel 模型关系相关函数

模型关系:
\Illuminate\Database\Eloquent\Relations\HasOneOrMany.php
主表 HasOneOrMany 子表

getLocalKeyName();//id 获取主表
getForeignKeyName();//inquiry_id
getQualifiedParentKeyName();//主表.id
getQualifiedForeignKeyName();//从表.inquiry_id

\Illuminate\Database\Eloquent\Relations\BelongsTo.php
从表 BelongsTo 主表
getForeignKeyName();//inquiry_id
getOwnerKeyName();//id
getQualifiedOwnerKeyName();//主表.id
getQualifiedForeignKeyName();//从表.inquiry_id

例如
用户拥有手机
手机属于用户
User->phone()->getForeignKeyName();Phone->user()->getOwnerKeyName();

iOS发布新应用/更新新版本的流程

1.钥匙串中导出CSR文件——生成cer证书(开发/发布证书)——-设置APPID(其实就是设置bundleID)——-通过cer证书和APPID生成mobileProvision文件—导出ce’r证书和mobileProvision文件,分别双击即可;

2.打开应用程序——设置好bundleID(要和申请证书的时候一样)——设置好版本发布版本version和内部版本build(如果是版本更新,要设置的比以前大)—-team设置(选择开发者账号)——-选择general iOS device ———-product ——-archive—–upload(上传应用到app),validate(验证合法性),export(打包成 ipa 并导出)——–如果上产完成会出现success;

3.提交应用的方法:1.底部打开的 xcode图标—-右键open DeveloperTool ——Application Loader ;

                         方法2.设备选择  generic   iOS  device   -------archive -----(步骤2详解)

4.在开发者中心设置:iTunes connect ——进入我的app设置,

5.常见的问题:a.WWDC证书过期问题———解决:删除以前的过期证书,到苹果官网下一个双击即可;

                  b.xcode要用正式版,beta版会上传失败

                  c.在不同的电脑上发布-----------解决方法1:从别的电脑上的cer 证书导出p.12文件(有密码的),加上               mobileProvison文件就可以在本机上发布了;

                                                                  解决方法2:自己在开发者中心重新配置证书(发布证书只能创建两个)

————————————————
版权声明:本文为CSDN博主「liyubao160」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011146511/article/details/51789927

MySQL – AND/OR执行顺序

MySql中,会按以下权重顺序执行NOT > AND > OR,且where后面如果有or,or会自动把左右分组
例如:
SELECT * FROM student WHERE id=10001 ANDname='小A' OR 1=1 ANDage=18;
相当于
SELECT * FROM student WHERE (id=10001 ANDname='小A') OR (1=1 ANDage=18);

例如:
select * from book where bid in (1,3,4) or bname like 'Java%' and price = 30
相当于
因为Mysql先处理AND操作符,所以先判断bname like ‘Java%’ and price = 30,没有符合该条件的记录,再和bid in (1,3,4)做或运算.

nginx没有正确挂在php-fpm导致无法解析php(访问页面变成下载或者白屏)

昨天公司同事接受一个项目服务器,但是php站点死活打不开,表现为打开index.html后缀文件可以访问,打开php后缀文件会变成下载.
一开始怀疑的是文件头content-type没有正确设置,正确的文件头应该如下(人工手敲可能会敲成html/text),
`content-type: text/html; charset=utf-8`
但是检查过后发现是没问题的,于是开始分析,网站域名和端口能正确解析,证明nginx是有工作的,html文件能正确解析,但是php文件不能解析,就证明php服务是没有正确工作的,顾初步怀疑是php-fpm的问题,因php-fpm没有正确解析编译php导致访问.php文件后浏览器会变成下载.
一番折腾后,在nginx对应的虚拟站点配置文件中添加下如下配置即可
```shell

#当请求网站下php文件的时候,反向代理到php-fpm
location ~ .php$ {
include /usr/local/etc/nginx/fastcgi.conf; #加载nginx的fastcgi模块
include fastcgi_params;
fastcgi_intercept_errors on;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000; #交由fastcgi(php-fpm)处理,nginx fastcgi进程监听的IP地址和端口
}
“`

linux下查看php-fpm是否开启以及如何开启

记录linux下查看php-fpm是否开启以及如何开启(nginx也是同理)的命令,以备以后快速查看。
1、查看php-fpm是否开启

命令:ps -ef|grep php

结果如下:

这应该是没有开启。

2、查看php-fpm的位置

命令:whereis php-fpm

3、开启php-fpm

命令:/usr/local/bin/php-fpm

4、再次输入命令ps -ef|grep php,查看是否已经开启

这是已经开启了。

使用反射函数处理httpresponse object

最近同事在对接接口的时候得到了一个Httpresponse Object对象,这玩意嘛,来,大家感受下

object(HttpResponse)#11 (7) {
  ["content":"HttpResponse":private] => string(1047) "HTTP/1.1 200 OK
Server: Tengine
Date: Fri, 22 Jun 2018 09:52:33 GMT
Content-Type: application/json; charset=UTF-8
Content-Length: 52
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,HEAD,OPTIONS,PATCH
Access-Control-Allow-Headers: X-Requested-With,X-Sequence,X-Ca-Key,X-Ca-Secret,X-Ca-Version,X-Ca-Timestamp,X-Ca-Nonce,X-Ca-API-Key,X-Ca-Stage,X-Ca-Client-DeviceId,X-Ca-Client-AppId,X-Ca-Signature,X-Ca-Signature-Headers,X-Ca-Signature-Method,X-Forwarded-For,X-Ca-Date,X-Ca-Request-Mode,Authorization,Content-Type,Accept,Accept-Ranges,Cache-Control,Range,Content-MD5
Access-Control-Max-Age: 172800
X-Ca-Request-Id: CC7C80AD-3CCB-4F54-B14D-3BDA143AC3BE
Vary: Accept-Encoding
ufe-result: A2
Pragma: no-cache
Cache-Control: no-store
Via: 71aae546d43b[web,200]
Set-Cookie: SERVERID=c0cb0a9f805e8a70fc370b48877e9e8e|1529661153|1529661153;Path=/
X-Ca-Error-Message: OK
X-Ca-Debug-Info: {"TotalLatency":81,"ServiceLatency":55}

{"code":601,"message":"数据不存在","data":null}"
  ["body":"HttpResponse":private] => string(52) "{"code":601,"message":"数据不存在","data":null}"
  ["header":"HttpResponse":private] => string(995) "HTTP/1.1 200 OK
Server: Tengine
Date: Fri, 22 Jun 2018 09:52:33 GMT
Content-Type: application/json; charset=UTF-8
Content-Length: 52
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,HEAD,OPTIONS,PATCH
Access-Control-Allow-Headers: X-Requested-With,X-Sequence,X-Ca-Key,X-Ca-Secret,X-Ca-Version,X-Ca-Timestamp,X-Ca-Nonce,X-Ca-API-Key,X-Ca-Stage,X-Ca-Client-DeviceId,X-Ca-Client-AppId,X-Ca-Signature,X-Ca-Signature-Headers,X-Ca-Signature-Method,X-Forwarded-For,X-Ca-Date,X-Ca-Request-Mode,Authorization,Content-Type,Accept,Accept-Ranges,Cache-Control,Range,Content-MD5
Access-Control-Max-Age: 172800
X-Ca-Request-Id: CC7C80AD-3CCB-4F54-B14D-3BDA143AC3BE
Vary: Accept-Encoding
ufe-result: A2
Pragma: no-cache
Cache-Control: no-store
Via: 71aae546d43b[web,200]
Set-Cookie: SERVERID=c0cb0a9f805e8a70fc370b48877e9e8e|1529661153|1529661153;Path=/
X-Ca-Error-Message: OK
X-Ca-Debug-Info: {"TotalLatency":81,"ServiceLatency":55}

"
  ["requestId":"HttpResponse":private] => string(36) "CC7C80AD-3CCB-4F54-B14D-3BDA143AC3BE"
  ["errorMessage":"HttpResponse":private] => string(2) "OK"
  ["contentType":"HttpResponse":private] => string(31) "application/json; charset=UTF-8"
  ["httpStatusCode":"HttpResponse":private] => int(200)
}

这个数据块,让人有点摸不着头脑,尝试使用了以下方法都失败告终
1.强制转数组,(array) data
2.json_decode(json_encode(
data),true)
3.直接用$object->属性

最后在万能的度娘帮助下,使用了php的反射函数处理了数据

$ref = new ReflectionClass($response);
        $props = $ref->getProperties();
        $arr = [];


        foreach ($props as $prop) {
            $prop->setAccessible(true);
            $arr[$prop->getName()] = $prop->getValue($response);
            $prop->setAccessible(false);
        }

最后如愿得到了一个数组类型数据

array(7) {
  ["content"] => string(1048) "HTTP/1.1 200 OK
Server: Tengine
Date: Mon, 25 Jun 2018 02:22:15 GMT
Content-Type: application/json; charset=UTF-8
Content-Length: 52
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,HEAD,OPTIONS,PATCH
Access-Control-Allow-Headers: X-Requested-With,X-Sequence,X-Ca-Key,X-Ca-Secret,X-Ca-Version,X-Ca-Timestamp,X-Ca-Nonce,X-Ca-API-Key,X-Ca-Stage,X-Ca-Client-DeviceId,X-Ca-Client-AppId,X-Ca-Signature,X-Ca-Signature-Headers,X-Ca-Signature-Method,X-Forwarded-For,X-Ca-Date,X-Ca-Request-Mode,Authorization,Content-Type,Accept,Accept-Ranges,Cache-Control,Range,Content-MD5
Access-Control-Max-Age: 172800
X-Ca-Request-Id: 271C3605-1937-4FF4-8D9B-D8E0F530875C
Cache-Control: no-store
X-Ca-Error-Message: OK
Vary: Accept-Encoding
ufe-result: A2
Pragma: no-cache
Via: 71aae546d43b[web,200]
Set-Cookie: SERVERID=c0cb0a9f805e8a70fc370b48877e9e8e|1529893335|1529893335;Path=/
X-Ca-Debug-Info: {"TotalLatency":105,"ServiceLatency":56}

{"code":601,"message":"数据不存在","data":null}"
  ["body"] => string(52) "{"code":601,"message":"数据不存在","data":null}"
  ["header"] => string(996) "HTTP/1.1 200 OK
Server: Tengine
Date: Mon, 25 Jun 2018 02:22:15 GMT
Content-Type: application/json; charset=UTF-8
Content-Length: 52
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,HEAD,OPTIONS,PATCH
Access-Control-Allow-Headers: X-Requested-With,X-Sequence,X-Ca-Key,X-Ca-Secret,X-Ca-Version,X-Ca-Timestamp,X-Ca-Nonce,X-Ca-API-Key,X-Ca-Stage,X-Ca-Client-DeviceId,X-Ca-Client-AppId,X-Ca-Signature,X-Ca-Signature-Headers,X-Ca-Signature-Method,X-Forwarded-For,X-Ca-Date,X-Ca-Request-Mode,Authorization,Content-Type,Accept,Accept-Ranges,Cache-Control,Range,Content-MD5
Access-Control-Max-Age: 172800
X-Ca-Request-Id: 271C3605-1937-4FF4-8D9B-D8E0F530875C
Cache-Control: no-store
X-Ca-Error-Message: OK
Vary: Accept-Encoding
ufe-result: A2
Pragma: no-cache
Via: 71aae546d43b[web,200]
Set-Cookie: SERVERID=c0cb0a9f805e8a70fc370b48877e9e8e|1529893335|1529893335;Path=/
X-Ca-Debug-Info: {"TotalLatency":105,"ServiceLatency":56}

"
  ["requestId"] => string(36) "271C3605-1937-4FF4-8D9B-D8E0F530875C"
  ["errorMessage"] => string(2) "OK"
  ["contentType"] => string(31) "application/json; charset=UTF-8"
  ["httpStatusCode"] => int(200)
}

laravel 日志无权限写入报错(服务器生成日志无权限)

原因分析是:其他角色写入日志导致权限不可写

例如:定时器执行任务的用户不是项目组用户等

日志文件的权限也可以在每天创建时配置

解决方案:不适用root用户创建定时用户,使用www用户创建定时用户
crontab -u www -e

如果服务器环境为宝塔,且使用的是宝塔面板的定时任务
可以使用 su -c 和 -s 搭配操作,为计划任务指定执行用户,来解决此问题。
如:
su -c "/www/server/php/73/bin/php -q /www/wwwroot/xx/artisan schedule:run 2>&1" -s /bin/sh www

nvm常用命令

nvm for windows是一个命令行工具,在控制台输入nvm,就可以看到它的命令用法。基本命令有:

nvm arch [32|64] : 显示node是运行在32位还是64位模式。指定32或64来覆盖默认体系结构。
nvm install [arch]: 该可以是node.js版本或最新稳定版本latest。(可选[arch])指定安装32位或64位版本(默认为系统arch)。设置[arch]为all以安装32和64位版本。在命令后面添加–insecure ,可以绕过远端下载服务器的SSL验证。
nvm list [available]: 列出已经安装的node.js版本。可选的available,显示可下载版本的部分列表。这个命令可以简写为nvm ls [available]。
nvm on: 启用node.js版本管理。
nvm off: 禁用node.js版本管理(不卸载任何东西)
nvm proxy [url]: 设置用于下载的代理。留[url]空白,以查看当前的代理。设置[url]为none删除代理。
nvm node_mirror [url]:设置node镜像,默认为https://nodejs.org/dist/.。我建议设置为淘宝的镜像https://npm.taobao.org/mirrors/node/
nvm npm_mirror [url]:设置npm镜像,默认为https://github.com/npm/npm/archive/。我建议设置为淘宝的镜像https://npm.taobao.org/mirrors/npm/
nvm uninstall : 卸载指定版本的nodejs。
nvm use [version] [arch]: 切换到使用指定的nodejs版本。可以指定32/64位[arch]。nvm use 将继续使用所选版本,但根据提供的值切换到32/64位模式的
nvm root [path]: 设置 nvm 存储node.js不同版本的目录 ,如果未设置,将使用当前目录。
nvm version: 显示当前运行的nvm版本,可以简写为nvm v
常用实例

nvm list  //查看目前已经安装的版本
nvm list available //显示可下载版本的部分列表
nvm install 10.15.0 //安装指定的版本的nodejs
nvm use 10.15.0 //使用指定版本的nodejs
npm install -g cnpm –registry=https://registry.npm.taobao.org //使用淘宝镜像

npm升降版本

降级
举例:降级到4
npm install npm@4 -g(@后跟版本号,若跟的是大版本,则更新到对应大版本最新的小版本)
npm install npm@4.1.2 -g(更新到指定版本)

升级
npm install npm -g(更新到最新版本)

Linux命令大全

基本操作

Linux 关机,重启

# 关机
shutdown -h now
# 重启方式1
shutdown -r now
# 重启方式2
init 6

查看系统,CPU信息

# 查看系统内核信息
uname -a

# 查看系统内核版本
cat /proc/version

# 查看当前用户环境变量
env

cat /proc/cpuinfo

# 查看有几个逻辑cpu, 包括cpu型号
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

# 查看有几颗cpu,每颗分别是几核
cat /proc/cpuinfo | grep physical | uniq -c

# 查看当前CPU运行在32bit还是64bit模式下, 如果是运行在32bit下也不代表CPU不支持64bit
getconf LONG_BIT

# 结果大于0, 说明支持64bit计算. lm指long mode, 支持lm则是64bit
cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l

建立软连接

ln -s /usr/local/jdk1.8/ jdk

rpm相关

# 查看是否通过rpm安装了该软件
rpm -qa | grep 软件名

sshkey

# 创建sshkey
ssh-keygen -t rsa -C your_email@example.com

#id_rsa.pub 的内容拷贝到要控制的服务器的 home/username/.ssh/authorized_keys 中,如果没有则新建(.ssh权限为700, authorized_keys权限为600)

last, 最近登录信息列表

# 最近登录的5个账号
last -n 5

查看进程内加载的环境变量

查看进程树找到服务器进程

查看进程启动路径

cd /proc/xxx(进程号)
ls -all
# cwd对应的是启动路径

添加用户, 配置sudo权限

# 新增用户
useradd 用户名
passwd 用户名

#增加sudo权限
vim /etc/sudoers
# 修改文件里面的
# root    ALL=(ALL)       ALL
# 用户名 ALL=(ALL)       ALL

强制关闭进程名包含xxx的所有进程

ps aux|grep xxx | grep -v grep | awk '{print $2}' | xargs kill -9

磁盘,文件,目录相关操作

vim操作

#normal模式下 g表示全局, x表示查找的内容, y表示替换后的内容
:%s/x/y/g

#normal模式下
0  # 光标移到行首(数字0)
$  # 光标移至行尾
shift + g # 跳到文件最后
gg # 跳到文件头

# 显示行号
:set nu

# 去除行号
:set nonu

# 检索
/xxx(检索内容)  # 从头检索, 按n查找下一个
?xxx(检索内容)  # 从尾部检索

查看磁盘, 文件目录基本信息

# 查看磁盘挂载情况
mount

# 查看磁盘分区信息
df

# 查看目录及子目录大小
du -H -h

# 查看当前目录下各个文件, 文件夹占了多少空间, 不会递归
du -sh *

wc命令

# 查看文件里有多少行
wc -l filename

# 看文件里有多少个word
wc -w filename

# 文件里最长的那一行是多少个字
wc -L filename

# 统计字节数
wc -c

常用压缩, 解压缩命令

压缩命令

tar czvf xxx.tar 压缩目录
zip -r xxx.zip 压缩目录

解压缩命令

tar zxvf xxx.tar

# 解压到指定文件夹
tar zxvf xxx.tar -C /xxx/yyy/

unzip xxx.zip

变更文件所属用户, 用户组

chown eagleye.eagleye xxx.log

cp, scp, mkdir

#复制
cp xxx.log
cp old.log new.log

# 复制并强制覆盖同名文件
cp -f xxx.log

# 复制文件夹
cp -r xxx(源文件夹) yyy(目标文件夹)

# 远程复制
scp -P ssh端口 username@10.10.10.101:/home/username/xxx /home/xxx

# 级联创建目录
mkdir -p /xxx/yyy/zzz

# 批量创建文件夹, 会在test,main下都创建java, resources文件夹
mkdir -p src/{test,main}/{java,resources}

检索相关

grep 每天一个Linux命令:grep

# 反向匹配, 查找不包含xxx的内容
grep -v xxx

# 排除所有空行
grep -v '^/pre>

# 返回结果 2,则说明第二行是空行
grep -n “^$” 111.txt    

# 查询以abc开头的行
grep -n “^abc” 111.txt 

# 同时列出该词语出现在文章的第几行
grep 'xxx' -n xxx.log

# 计算一下该字串出现的次数
grep 'xxx' -c xxx.log

# 比对的时候,不计较大小写的不同
grep 'xxx' -i xxx.log

awk

每天一个linux命令:awk

# 以':' 为分隔符,如果第五域有user则输出该行
awk -F ':' '{if (5 ~ /user/) print0}' /etc/passwd 

# 统计单个文件中某个字符(串)(中文无效)出现的次数
awk -v RS='character' 'END {print --NR}' xxx.txt

find检索命令

每天学一个 Linux 命令(20):find

# 在目录下找后缀是.mysql的文件
find /home/eagleye -name '*.mysql' -print

# 会从 /usr 目录开始往下找,找最近3天之内存取过的文件。
find /usr -atime 3 –print

# 会从 /usr 目录开始往下找,找最近5天之内修改过的文件。
find /usr -ctime 5 –print

# 会从 /doc 目录开始往下找,找jacky 的、文件名开头是 j的文件。  
find /doc -user jacky -name 'j*' –print

# 会从 /doc 目录开始往下找,找寻文件名是 ja 开头或者 ma开头的文件。
find /doc \( -name 'ja*' -o- -name 'ma*' \) –print

#  会从 /doc 目录开始往下找,找到凡是文件名结尾为 bak的文件,把它删除掉。-exec 选项是执行的意思,rm 是删除命令,{ } 表示文件名,“\;”是规定的命令结尾。 
find /doc -name '*bak' -exec rm {} \;

#查找当前目录下文件大小超过500M的文件
find . -type f -size +500M   

监控linux性能命令

top

按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序, 然后回车。而大写的 R 键可以将当前的排序倒转。每天学一个 Linux 命令(48):top

PID 进程id
PPID 父进程id
RUSER Real user name
UID 进程所有者的用户id
USER 进程所有者的用户名
GROUP 进程所有者的组名
TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
PR 优先级
NI nice值。负值表示高优先级,正值表示低优先级
P 最后使用的CPU,仅在多CPU环境下有意义
%CPU 上次更新到现在的CPU时间占用百分比
TIME 进程使用的CPU时间总计,单位秒
TIME+ 进程使用的CPU时间总计,单位1/100秒
%MEM 进程使用的物理内存百分比
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
CODE 可执行代码占用的物理内存大小,单位kb
DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
SHR 共享内存大小,单位kb
nFLT 页面错误次数
nDRT 最后一次写入到现在,被修改过的页面数。
S 进程状态。D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程
COMMAND 命令名/命令行
WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
Flags 任务标志,参考 sched.h

iostat,磁盘IO情况监控

iostat -xz 1

# r/s, w/s, rkB/s, wkB/s:分别表示每秒读写次数和每秒读写数据量(千字节)。读写量过大,可能会引起性能问题。
# await:IO操作的平均等待时间,单位是毫秒。这是应用程序在和磁盘交互时,需要消耗的时间,包括IO等待和实际操作的耗时。如果这个数值过大,可能是硬件设备遇到了瓶颈或者出现故障。
# avgqu-sz:向设备发出的请求平均数量。如果这个数值大于1,可能是硬件设备已经饱和(部分前端硬件设备支持并行写入)。
# %util:设备利用率。这个数值表示设备的繁忙程度,经验值是如果超过60,可能会影响IO性能(可以参照IO操作平均等待时间)。如果到达100%,说明硬件设备已经饱和。
# 如果显示的是逻辑设备的数据,那么设备利用率不代表后端实际的硬件设备已经饱和。值得注意的是,即使IO性能不理想,也不一定意味这应用程序性能会不好,可以利用诸如预读取、写缓存等策略提升应用性能。

free,内存使用情况

free -m

eg:

     total       used       free     shared    buffers     cached
Mem:          1002        769        232          0         62        421
-/+ buffers/cache:          286        715
Swap:          1153          0       1153