Code Monkey home page Code Monkey logo

blog's Introduction

blog's People

Contributors

luanguang avatar

Stargazers

kunlei-hong avatar wisehai avatar  avatar  avatar Tacks avatar  avatar sam_xiong avatar  avatar douyu610588 avatar 余晓波 avatar Josscii avatar  avatar  avatar

Watchers

James Cloos avatar

blog's Issues

常用的mysql优化方法

mysql表记录的时候,会记录变长字段长度列表和NULL字段列表
相较于NOT NULL,NULL要记录更多的数据,所以尽量使用NOT NULL
同理,尽量将字段的长度固定,这样也可以减少一部分数据记录空间。

现代php基石composer

require 如果文件不存在,则报错fatal error,并停止脚本;
include如果文件不存在,则出现warning,并继续脚本;
require_onceinclude_once在执行过程中,都先检验是否已经加载,加载过就不加载了。
__DIR__返回当前文件的绝对路径
比如Laravelpublic/index.php中,返回的就是

/var/www/yangmao/public/../vendor/autoload.php

Redis为什么快

从硬件角度来看,redis的操作都是在内存当中进行的。
内存每次寻址时间在100ns
SSD随机读取时间在150us
相差了1000倍

laradock起mongo报错EXIT 14

a) 打开 .env 文件

b) 在Workspace Container下搜索WORKSPACE_INSTALL_MONGO 参数

c) 将其设置为 true

d) 在PHP-FPM容器下搜索PHP_FPM_INSTALL_MONGO 参数

e) 将其设置为 true

2 - 重构容器 docker-compose build workspace php-fpm

3 - 使用 docker-compose up 命令运行MongoDB Container(mongo)。

docker-compose up -d mongo

然而docker-compose ps却发现

laradock_mongo_1          docker-entrypoint.sh mongod      Exit 14

这种情况下,你可以尝试一下把docker-compose.yml文件里的mongoDB的路径地址改一下

### MongoDB ##############################################
    mongo:
      build: ./mongo
      ports:
        - "${MONGODB_PORT}:27017"
      volumes:
        #- ${DATA_PATH_HOST}/mongo:/data/db
        - ${DATA_PATH_HOST}/mongo:/data/mongodb
      networks:
        - backend

记录:刚遇到的 Laravel 使用 easywechat 的小坑

按照文档一步步跟着走,把所有的配置文件配置完成,提交到服务器上想进行简单的测试。然后用浏览器访问了一下,结果出现This page contains the following errors: error on line 1 at column 1: Document is empty的报错,然后查到这个访问一开始就没准备让浏览器来,所以这种错误不必担心。
但是接下来我发信息给自己的公众号,可是一直提醒该公众号提供的服务出现故障,请稍后再试。接下来就是许久的谷歌查找相应的解决办法,不过可惜没有找到。
因为做项目都是用的lumen没有出现过这种错误,于是想起会不会是laravel的CSRF的缘故,于是添加了白名单。结果问题就解决了。

RESTFul是什么

GET /user 获取个人资料
PUT /user 修改个人资料
POST /user/register 注册用户
DELETE /user 删除用户

看Url就知道要什么
看http method就知道干什么
看http status code就知道结果如何

贪婪非贪婪匹配浅析

贪婪匹配

.*

<?php
$pre = '/.*(\d+)/';
$str = 'hello 1234567 world';
preg_match($pre, $str, $matches);
print_r($matches[1]);
#7

这里就涉及一个贪婪匹配与非贪婪匹配的问题了。在贪婪匹配下,.*会匹配尽可能多的字符。正则表达式中.*后面是\d+,也就是至少一个数字,并没有指定具体多少个数字,因此,.*就尽可能匹配多的字符,这里就把123456匹配了,给\d+留下一个可满足条件的数字7,最后得到的内容就只有数字7了。

非贪婪匹配

.*?

<?php
$pre = '/.*?(\d+)/';
$str = 'hello 1234567 world';
preg_match($pre, $str, $matches);
print_r($matches[1]);
#1234567

此时就可以成功获取1234567了。原因可想而知,贪婪匹配是尽可能匹配多的字符,非贪婪匹配就是尽可能匹配少的字符。当.*?匹配到Hello后面的空白字符时,再往后的字符就是数字了,而\d+恰好可以匹配,那么这里.*?就不再进行匹配,交给\d+去匹配后面的数字。所以这样.*?匹配了尽可能少的字符,\d+的结果就是1234567了。

在做匹配的时候,字符串中间尽量使用非贪婪匹配,当然php本身就有许多方法,可以避开不适用正则,能用原生方法最好用原生。

在php当中很少用到正则匹配,对于贪婪与非贪婪更是没有使用到过,这次是学习爬虫时,根据python3网络爬虫开发实战教程一步步走下来,然后看到的知识点。

mac遇到了crontab tmp/tmp : Operation not permitted的问题

刚接触mac,这个问题困扰了我三天。我一开始将所有报错复制粘贴进行搜索,但是不管谷歌还是百度,给出的答案都跟crontab有关。然后尝试开始创建文件,使用mac上的crontab。只是根本没有效果。
stackoverflow给出的答案是要在安全中将iterm2给全部文件的权限。
然而我是在php执行exec时候无法将crontab写入,跟这个毫无关系。抱着尝试的心态去操作,结果一样是失败的。

最后用关键字搜索Operation not permitted,搜到了mac的rootless权限策略,然后跟边上的同事一对比,还真是因为这个开启导致的。

今天同事的新mac也有这个问题,但是在执行php的exec的时候,居然直接有提醒是否要让php-fpm接管。
我当时为什么没有啊!!!!心态炸了

JWT的理解

众所周知,HTTP是无状态的。为了能够记录下信息,引入了session和cookie。

cookie是存放在用户客户端(大多是在浏览器里),每次对一些已经登陆过或者浏览过的网页进行访问的时候,都会带上这个cookie,方便服务器识别自己。

cookies具有不跨域名性,你拿京东的cookie给淘宝,淘宝肯定也不认。
假如服务器不支持cookie,也会在url上带上sid用于分别用户。

session则是存放在服务器内存、数据库、文件等当中,是一串字符串,记录了用户的信息。
session的扩展能力不是很好,比如说一个集群有两台机器AB,那么登录A,只在A记录了session,B不能使用。除非让他们同步,或者弄一台机器专门存储session。但是随着信息增加,这就造成了一个大的负担。

给博客上个HTTPS

第一步

# 下载 Certbot 客户端
$ wget https://dl.eff.org/certbot-auto

# 设为可执行权限
$ chmod a+x certbot-auto

第二步 将XXX.com改成自己的域名
./certbot-auto certonly -d "*.xxx.com" --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory

第三步

输入自己邮箱之后,他会发送一份邮件给你确认,确认完毕,到Before continuing这里先不要立刻点击确认。到域名解析里添加一条txt的解析,值是添加_acme-chanllenge.你的域名。下面的一串添加到记录值里。然后添加成功再按回车继续。

第四步
到nginx配置文件里添加

listen 443 http2 ssl;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/xxx.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/xxx.com/privkey.pem;

第五步 想要直接跳转到https,添加

server {
       listen 80;
       server_name XXXX;
       location / {
           return 301 https://$server_name$request_uri;
       }
  }

forum项目总结

forum项目是根据laracasts的testing里的学习教程一步步搭建而成。

加深理解

laravel可以不用observer,直接在模型里定义一个boot方法就能使用自带的十种监听事件的方法,个人感觉简单的处理可以直接放在模型当中,而处理比较多的时候,建议还是合并到一个observer里,在serviceprovider里记得注册。
工厂模式生成数据,在Modelfactory中,define生成多种不同数据,使用php artisan tinker创建定义的数据。

普通理解

测试用例,laravel自带登录的方法actingAs,不同guarded可以传入不同的参数进行模拟登录操作。不过没有尝试过用jwt方式。测试时,因为phpunit版本问题出过许多bug,例如assertDatabaseMission这方法不存在之类的无法解决。
laravel定义了许多断言方法供你测试返回的数据是否正确。

一知半解

Gate的使用,定义某个固定的用户为管理员权限。
每次执行控制器,都会先访问模型当中有没有跟引入trait一样名字的boot方法。
在serviceprovider当中用composer方法共享数据,可以传入到缓存当中,只需查询一次,不比多次查询,优化查询效率。
定义policy,控制部分方法的权限,比如说update只能是管理员或者这个文章或者回复的发起人。
laravel自带的提醒notify监控。
发送邮件所需配置,以及驱动设置。

缺点

知识点过多,导致分散。以及重构将一眼能看完的代码分成了多个地方,虽然感觉代码更少,更整洁。但是过几天重新打开这个项目再回味,发现忘记的也差不多了,还要来回查找这个方法哪里来的。新人有些难受。

报错It is unsafe to run Dusk in production

今天把博客布置上线,运行完composer install之后,报错It is unsafe to run Dusk in production.
这是因为安装了dusk包,当你的APP_ENV=local、testing时是本地测试环境,他就是用来检测代码的质量如何,所以不会抛出这个异常。但是当你的APP_ENV=production时,也就是你部署到线上了,这个包会暴露很多接口以及程序信息,会给你的程序带来致命的危险。
解决办法也很简单,要么在线上的时候把这个包给删除掉。要么就是在安装这个包的时候,将他放在composer.json文件的require-dev下面,在线上composer安装完毕,再运行一下

composer install --no-dev

问题解决。

编码粗浅

作者从夜晚手电筒的闪烁传递信息开始,引入了编码这么一种概念。有了这么一个概念之后,再次引入了莫尔斯码以及布莱叶盲文与二进制编码。
接着作者再次引入了电流,电子的移动产生电流,使用电流,在两个人的房间内安装灯泡,通过灯泡的闪烁表达不同的二进制码,而这些二进制码传递不同的信息。
电报机原理:在线路一端采取一些措施,使线路另一端发生某种变化。灯泡的闪烁由另一个房间的人控制,也算是简陋的电报机。
而后猜想两人之间的距离如果太远,电流不够,还需要一个放大器来完成,于是又引出了中继器这么一个东西。
解释了为什么人类习惯性用十进制,因为人的手指一共是十根,这样计算更加方便符合人类的思维。同时阐述了二进制对于传递信息是更加方便的。
二进制有了,电流传递有了,数学当中的集合逻辑引入,从而引入了电流控制,使用串联,并联的方式,生成了与门和或门。

正则匹配

常用的符号:

\d: (decimal)匹配任意数字
\s: (spacing)匹配空白符
\w: (word)匹配任意字符数字下划线,相当于[0-9a-z_A-Z]

所有大写都是反向匹配。

.: 匹配除新行符 (rn) 序列外的任何单个字符
+: 匹配一个或者多个前面的字符
*: 匹配0或者多个前面的字符

括号

(): 匹配括号里的字符
[]: 匹配括号里包含的其中的一个字符
{}: 匹配括号当中的次数范围

面试遇到的问题,没有回答出来记录

多技

  1. I/O复用
    这个跟select、poll、epoll有关,一个tcp链接一个进程,少的时候没关系,但是多了就有问题。于是有了一个进程里面有多个线程进行链接,但是没有立刻执行,在系统有数据返回的时候再循环这些线程,给需要的线程进行执行。这是select。
    而这样子循环也是很缓慢的,有性能问题。于是记录下每个线程的一个id,当系统返回数据的时候也传回id,就能直接去线程里查找这些id,不要每次都循环遍历。这是epoll。poll只是对select进行记录,并没有实质性的大变化。

  2. redis为什么快
    首先redis是将记录在内存当中的。而内存的速度原本就要比硬盘快上很多,不需要进行硬盘读取的I/O。
    数据结构简单,他是Nosql。
    单线程阻塞I/O。不需要进行线程之间的切换(历史问题,现已经改成多线程)。

  3. 258M的服务器内存,如何对1G的文件进行排序。
    这是一个很典型使用归并算法的题目,还是需要申请磁盘空间,时间复杂度是nlogn。优化之后最好能达到n。

  4. 简单的依赖注入和控制反转
    依赖注入很简单,构造函数,然后传特定的类进去。控制反转则需要进行判断他需要什么类,然后传进去。

  5. 并发时QPS多少。
    这个由于是运维当时观察,我并没有看到是多少,至于升级的服务器还是由运维来决定的。
    pv 是指页面被浏览的次数,比如你打开一网页,那么这个网站的pv就算加了一次;
    tps是每秒内的事务数,比如执行了dml操作,那么相应的tps会增加;
    qps是指每秒内查询次数,比如执行了select操作,相应的qps会增加。

进程和线程的粗浅理解

在计算机最开始的时候,运行一个程序,是要这个程序从开始到结束都在CPU当中进行运行,其他程序想要运行,必须等这个程序运行结束之后,才能开启。后来觉得这样做的效率太低,于是使用了进程这么一种概念。就是运行一个程序开启一个进程,比如运行计算器,那么久开启一个计算器的进程。
而且这个进程不是一直占用着CPU,而是跟其他进程相互穿插使用。因为CPU运行的速度实在太快,让我们这些人的眼睛根本区分不出来,使用的时候也不受到影响。
说到这里不得不提一句,化学中分子中也存在空隙,只是他们太小,欺骗了我们的眼睛,让我们误认为他们是没有间隙的,与计算机欺骗我们的方式何其相似。
后来发现一个进程有时候不能满足一部分操作。
以word举例,我们打开一个word文档的时候,就是开启了一个word进程。word可以进行编辑、保存等操作。但是我们编辑的时候,想要保存。一个进程只能完成一个操作,于是卡死在那里无法继续运行。于是乎有些线程这东西。线程成了程序执行的最小单位。一个进程最少有一个线程。
编辑用一个线程,保存又用一个线程。他们都包含在word这个进程当中。

现有进程后有线程

现代操作系统

线程三种状态:运行、就绪、堵塞。堵塞只能先去就绪。就绪能和运行互相转换,运行能转换成堵塞或者就绪。

cat group1 | grep blog
两个命令是同时运行的,只是grep运行遇到cat还没有查到结果就会堵塞在那里,等待cat运行完成。

php的静态延迟绑定理解

魔术方法的调用

<?php
class A {
    public $div = 0;
}
$a = new A();
$a->bar = 2;
echo $a->bar;
#2

能够直接访问未定义变量bar是因为调用了魔术方法__set

function __set($name, $value) {
    return $this->data[$name] = $value;
}

可以定义的就先定义,这也有一点小性能可以提升。

抽象类

抽象类的定义:定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。继承抽象类,必须实现抽象方法

关键字 abstract

static 静态延迟绑定

转发调用

self::, parent::, static::, forward_static_call()这几个方式都是转发调用

非转发调用

foo::bar(), foo->bar()这样子属于非转发调用

后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。

PHP面向对象中new self( )和 new static( ) 的区别

在PHP中 self指向定义了当前被调用方法的类, static指向调用当前静态方法的类。

<?php
class A {
    public static function foo() {
        static::who();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}

class B extends A {
    public static function test() {
        A::foo();
        parent::foo();
        self::foo();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}
class C extends B {
    public static function who() {
        echo __CLASS__."\n";
    }
}

C::test();
#A
#C
#C

static
图画的不是很准确,自己理解用

GET请求文件流下载CSV文件

本地和测试站请求都是可以的。但是正是站超过4000条就不行

$response = new Response();
        $response->headers->set('Content-type', 'text/csv');
        $response->headers->set('Content-Disposition', 'attachment; filename="'.$fileName.'"');
        $response->headers->set('Content-length', strlen($content));
        $response->setContent($content);

还想尝试用POST请求来完成,结果POST也是模拟点击用GET。各种排查最后发现,因为nginx临时目录没有写入权限。因为文件流过大的时候,会将这些数据写入nginx的临时目录当中缓存起来。

Anaconda下tesserocr的安装使用问题

我用的是Anaconda安装的python环境。废话不多说,直接进入正题。
安装tesserocr
conda install -c simonflueckiger tesserocr
这个安装完成之后,我们要去安装一下tesseract

tesserocr是Python的一个OCR识别库,但其实是对tesseract做的一层Python API封装,所以它的核心是tesseract。

链接
tesseract下载地址:http://digi.bib.uni-mannheim.de/tesseract 选一个不带dev的下载就行,安装的时候把所有勾上,大概有1.4GB大小。我从早上十点安装到了下午四点三十。可谓相当想死了。
安装完成后,我们将这个添加到环境和系统变量里去。
tim 20190105164531
tim 20190105164609
然后cmd测试看看有没有加进去了
tim 20190105164737
这样子在你安装的路径可以用了,不过我想要全局都能用咋办,添加一个新的系统变量。名字是TESSDATA_PREFIX,路径是你安装的路劲,比如我的C:\Program Files (x86)\Tesseract-OCR
图片跟本人有bu不同,把路径改成你自己的就可以了。
2018040120551510
然后重新打开你的cmd运行你的python文件,应该就能成功了。还不行……试试把testdata文件复制放到Anaconda目录下面……还不行,我也不知道了。

几核几线程什么意思

  1. 四核八线程是指使用了超线程技术 , 把一个物理核心,模拟成 两个逻辑核心, 理论上要像八颗物理核心一样在同一时间执行八个线程,所以设备管理器和任务管理器中会显示出八个核心,但事实上并不是真正的八个核心,四核八线程就是真四核,虚拟八核;

  2. 四核八线程在有些情况下比如任务量不大能让CPU利用率提高很多从而使其性能接近八核CPU的水平,而在另外一些情况比如CPU占用100%满负荷工作的情况下,这时候四核八线程和八核的性能表现差距明显,其实质就是虽然采用超线程技术能同时执行两个线程,但它并不象两个真正的CPU那样,每个CPU都具有独立的资源。当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续。因此超线程的性能并不等于两颗CPU的性能。这也是四核八线程和八核的最大区别。

  3. 总而言之四核8线程是4个物理核心模拟成8个逻辑核心,8核是8个物理核心

ssh的各种连接

最早时期计算机通信是明文没有加密的,发送的数据包都是可以被其他人截获并且进行读取的。所以非常的不安全。为了信息的隐秘性,所以对发送的数据进行加密。但是用什么方法加密呢?

  • 对称加密
  • 非对称加密
    对称加密要解决发送密钥的时候如何不被截获,当然选择肉身送密钥是可以的,但这不现实。于是有人发明了RSA非对称加密技术。A有一个公钥,一个私钥。私钥保留在自己这里,而公钥发送给想要发给的人。例如B接收了发自A的公钥,然后将要发送的信息用公钥进行加密处理,发回给A。这个时候就算有人之前截获了A的公钥,也没有办法破解B发送的信息内容。这个信息只能由A手中的私钥进行解析。同理,B也可以将自己的公钥发给A,私钥保留在自己的手中。
    安装完git之后,使用命令ssh-keygen,在.ssh目录下会生成公钥和私钥。id_rsa.pub和id_rsa,有pub结尾的是公钥。

但是这样子的做法还是有一个漏洞,那就是中间人攻击。比方说C截获了A的公钥,然后把自己的公钥发给B。B发送信息给A期间,C获取信息,用自己的私钥解析,然后再用A的公钥加密发回给A。这样子做依旧无法保护信息的隐秘性。
这只能让自己处于一个相对安全的网络环境来应对了。

延伸到HTTPS。公钥和私钥的加密方式虽然安全,但是速度太慢。于是就想用RSA的方式将对称加密的密钥传递给对方,这样子能快上许多。可是有中间人攻击,这样子做又不安全了。于是想要用数字签名。将一个人的公钥以及个人信息之类的用hash算法生成消息摘要(hash算法是输入只有有一种变化,生成的结果就天翻地覆),接着用有公信力的认证中心(简称CA)的私钥加密生成一个数字签名。数字签名和之前的公钥以及个人信息之类的合并成一个数字证书。这个数字证书得到之后进行对比,相同那么就没有被修改。

本地登录服务器,我们用ssh username@ip进行首次登陆会有一些提示确保你保证自己的网络没啥危险,然后输入密码。不过这样子以后每次登陆都需要密码太麻烦。于是我们用公钥登陆,也就是将自己本地的公钥传递给服务器,ssh-copy-id -i 路径 username@ip,服务器接受了本地的公钥,然后我们到/etc/ssh/sshd_config这个文件进行修改

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

把这三句前面的注释去掉,重启一下service ssh restart。就完成了。
ssh登录了一次之后,有一个文件known_hosts把公钥保存下来,下次登录的时候直接访问有没有。服务器还会生成一个authorized_keys来保存这个公钥,保存一行,另一个公钥重启一行。

用ssh连接服务器上的mysql。我用的是heidisql图形工具。首先我们将服务器上的用户名密码填上去。然后点开SSH隧道。
这时候我们需要先下载一个plink.exe,有32位和64位的。然后填写SSH主机+端口22。填上用户名,密码空着。接着我们加入本地的私钥文件,这个私钥文件必须是.ppk类型。所以我们需要下载一个PuTTY来将我们的私钥生成一个符合的文件。填写本地端口3307。我们只是使用SSH隧道,并不是SSH连接,而在隧道到达之后,3307会被转换成3306。点击打开,OK。

centOS7 lnmp的环境搭建以及laravel项目的部署

Ubuntu 14/16 下的 Laravel LNMP 线上环境自动部署脚本

https://laravel-china.org/topics/2814/ubuntu-1416-under-the-laravel-lnmp-online-environment-automatically-deploy-scripts

首先安装vim:

yum -y install vim-enhanced

安装nginx:

到官网的download里面我们看到了
nginx

vim /etc/yum.repos.d/nginx.repo
添加:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

wq退出 yum install nginx
有提醒就按y

开启nginx与开机自启:

systemctl start nginx

systemctl enable nginx

重点开放防火墙80端口:

firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=80/udp --permanent

重启防火墙:

systemctl restart firewalld.service

然后在浏览器输入服务器的地址或者ip,显示界面,nginx安装成功
nginx

安装mysql

下载mysql源安装包:

wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

安装mysql源:

yum localinstall mysql57-community-release-el7-8.noarch.rpm

检查mysql源是否安装成功:

yum repolist enabled | grep "mysql.*-community.*"
mysql

安装mysql:

yum install mysql-community-server

启动mysql:

systemctl start mysqld

然后查看mysql的初始密码:

grep 'temporary password' /var/log/mysqld.log
mysql

修改mysql密码:

shell> mysql -uroot -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourPassword9#'; 

修改mysql的默认编码为utf8

vim /etc/my.cnf

[mysqld]
character_set_server=utf8
init_connect='SET NAMES utf8'

mysql

安装mysql:

首先删除之前安装的php:

yum -y remove php*

更改yum源:

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm   
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm 

安装各种扩展:

yum -y install php72w php72w-cli php72w-common php72w-devel php72w-embedded php72w-fpm php72w-gd php72w-mbstring php72w-mysqlnd php72w-opcache php72w-pdo php72w-xml

添加用户和用户组,之后用到:

groupadd www
useradd -g www www

修改php配置:

vim /etc/php.ini

修改

;cgi.fix_pathinfo=1 -> cgi.fix_pathinfo=0

修改php-fpm配置:

vim /etc/nginx/nginx.conf

user  www www;
worker_processes auto;
[...]
include vhost/*.conf;

    server{
        listen       80 default;
        server_name _ "";
        index error.html;
        root  /home/www/error;

        location /nginx_status {
            stub_status  on;
            access_log   off;
            allow 127.0.0.1;
            deny all;
        }
        location / {
            allow 127.0.0.1;
            deny all;
        }
    }

修改完成,然后我们这之中包含了一个include vhost/*.conf
然后创建vhost文件夹

cd nginx
mkdir vhost
cd vhost
vim index.conf

server {

    listen 80;
    listen [::]:80;

    server_name ;### 你的域名或者ip
    root /home/www/;
    index index.php index.html index.htm;

    location / {
         try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

添加完成,接着

cd /home

分别修改文件夹的用户组和用户和文件权限

chown -R www www
chgrp -R www www
chmod -R 755 www

进入www目录创建一个index.php文件 在其中写

<?php
    phpinfo()

lnmp
🐂 🍺

LNMP环境终于搭建完成了,耶!

安装git

yum install git-core

安装composer

curl -sS https://getcomposer.org/installer | php #安装composer包
mv composer.phar /usr/local/bin/composer #将composer放到全局环境当中

现在访问composer -v

composer太慢想修改composer源可以执行下面这段代码

composer config -g repositories.packagist composer https://packagist.phpcomposer.com

安装laravel

composer global require "laravel/installer"

然后到 /home/www执行

composer create-project --prefer-dist laravel/laravel blog

修改用户,用户组,权限

chown -R www www
chgrp -R www www
chmod -R 755 www

修改.env文件

APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:zCWGDEsNSF0bmt/Gh/bdlcRHjWKCCiny6brrer5OZxA=
APP_DEBUG=true#线上改成false
APP_LOG_LEVEL=debug
APP_URL=你的服务器域名或者ip

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=你的数据库
DB_USERNAME=root
DB_PASSWORD=你的数据库密码

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
SESSION_LIFETIME=120
QUEUE_DRIVER=sync

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

到数据库创建一个blog(你想取啥名都行,只要在DB_DATABASE=你的名字就行)

然后到php artisan migrate生成成功

这里有一个坑,因为把数据库密码弄成了#X7a}eyZUPrsG#@( 结果因为最后有一个括号.env文件识别有误,一直报错密码错误,改了其他密码才成功……

然后你打开服务器,会看到有报错页面,说log不能执行,这里就是log文件权限不够

chmod -R 777 storage

777就完事儿了

于是看到了欣喜的画面
laravel

selenium不再支持phantomJS

运用selenium+PhantomJS的时候,曝出UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead
查了一下chrome和firefox都除了handless(无头)版本,所以可以不用PhantomJS了。
至于怎么用,之后再补充……

科学上网SS搭建

我推荐两家我用过的服务商吧,一家是Vultr,也是我正在使用的,没有信用卡的话也可以使用PayPal支付;另一家是搬瓦工(Bandwagon)。

搬瓦工有低配且便宜的选择,如果只是用于科学上网也还可以,目前在亚洲没有机房。Vultr相比搬瓦工费用能高一丢丢,最低配置(15GB SSD,1CPU,768MB Memory,1000GB Bandwidth)也不算差,除了科学上网放个网站也足矣。目前我使用东京节点的机子,进行路由跟踪你会发现会绕道美国,也有绕道香港的,这和当前所处的网络环境也有一定的关系。

安装 Shadowsocks

CentOS:

# yum install python-setuptools && easy_install pip
# pip install shadowsocks

Debian / Ubuntu:

# apt-get install python-pip
# pip install shadowsocks

服务器系统一般默认安装了 Python ,查看当前版本:

# python --version
Python 2.7.5

确保服务器安装的是 Python 2.6 or 2.7

配置 Shadowsocks

创建一份配置文件/etc/shadowsocks.json例如:

{
    "server":"my_server_ip",
    "server_port":8388,
    "local_address": "127.0.0.1",
    "local_port:":1080,
    "password":"mypassword",
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open": false
}

server:服务器IP地址
server_port:SS服务指定端口
local_address:本地服务地址,默认127.0.0.1
local_port:本地服务端口,常用1080
password:SS服务密码,禁止使用默认密码mypassword
timeout:服务超时,单位秒s
method:加密方式,默认aes-256-cfb
fast_open:TCP Fast Open ,true or false

配置多用户账号:

{
    "server":"my_server_ip",
    "port_password":{
    	"8388":"mypassword",
    	"8389":"mypassword",
        "8390":"mypassword"
    },
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open": false
}

使用 Shadowsocks

安装并写好配置后即可运行:
# ssserver -c /etc/shadowsocks.json

如果你通过SSH终端成功运行该命令,当关掉终端窗口服务随即终止。所以需要执行SS服务后台运行:

# ssserver -c /etc/shadowsocks.json -d start
# ssserver -c /etc/shadowsocks.json -d stop

如果要检查日志:
# less /var/log/shadowsocks.log

无法正常运行:

防火墙禁止端口访问
SS 安装了也配置了,启动服务也没问题,但是在电脑或者手机连接上直接超时了。这可能是防火墙的问题,Vultr 的CentOS 7 默认打开了防火墙,而 Ubuntu 14.04 则没有。

可清空防火墙所有规则:
# iptables -F

个人觉得没必要清空规则,相反,我们可以手动添加规则确保 SS 所使用的端口能正常使用:

# firewall-cmd --zone=public --add-port=8088/tcp --permanent
# firewall-cmd --zone=public --add-port=8088/udp --permanent

port即在配置文件里写的端口,执行后规则立即生效。

也可以通过修改/etc/firewalld/zones/public.xml文件,增加所要使用的端口,比如增加8088端口:

<port protocol="tcp" port="8088"/>
<port protocol="udp" port="8088"/>

保存后,运行:
# firewall-cmd --complete-reload

###socket.error: [Errno 99] Cannot assign requested address
在国内主机我尝试搭建 SS 也碰到过这个问题,具体解决办法是将 server 的 IP 设置为 0.0.0.0 即可解决上述问题,配置这样写:

{
    "server":"0.0.0.0",
    "server_port":8388,
    "local_address": "127.0.0.1",
    "local_port:":1080,
    "password":"mypassword",
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open": false
}

最后
感谢clowwindy的贡献,希望 Shadowsocks 能助你轻松科学上网。

https://xfabs.github.io/2016/08/02/shadowsocks/

learn TCP/IP协议

第一章 网络基础知识

OSI参考模型通信处理举例

以A发一封早上好的邮件给B为例子。

应用层

填写发件人,填写收件人,填写电子邮件内容。添加应用层的数据首部,通过接口传给表示层。

表示层

将电子邮件进行转码,转换成通用编码格式的内容,带上表示层数据首部,通过接口传递给会话层。

会话层

决定将电子邮件用何种连接方式(顺序)传送给对方,带上会话层数据首部,通过接口传递给传输层。

传输层

确定发送端A与接收端B的连接与断开连接,带上传输层数据首部,通过接口传递给网络层。

网络层

将数据发送到接收端,带上网络层数据首部,通过接口传递给数据链路层。

数据链路层

负责实现每一个区间内的通信,带上数据链路层数据首部,通过接口传递给物理层。

物理层

简单粗暴的将数据转换成0、1的电压和脉冲光传输过去,带上物理层的数据首部。

B接收端,从物理层开始一步步查看首部,通过接口向上传递,直到应用层能看到这条邮件为止。假如邮箱满了,返回异常处理,这是应用层干的事情。

关于urllib下的read()方法

from bs4 import BeautifulSoup
from urllib.request import urlopen
import lxml
html = urlopen("http://www.pythonscraping.com/pages/page1.html")
soup = BeautifulSoup(html.read(), 'lxml')
print(soup.h1)
print(html.read())

输出

<h1>An Interesting Title</h1>
b''

read方法只能用一次就没有了?为啥?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.