论文本编辑器让人眼花缭乱,例如UEdit、markdown等,对于程序员来说在,markdown运用于博客中是非常适合,包括写简历都可以奥,他会大大提高你的
逼格。最近接触了summernote编辑器,此编辑器是轻量级的,对于实用性选手来说比较适合,但是在上传照片是存在回调的问题,在这里简单的与大家聊聊……

###1.首先进入官网(http://summernote.org/)

1
2
3
有一些前端框架的中也有此编辑器……
windows中可以直接下载在官网
mac可以用:bower install summernote

2.实例化(初始化)

1
2
3
4
5
6
7
8
$('#summernote').summernote();
可以根据自己的喜好进行配置例如最小、最大高度,焦点等:
$('#summernote').summernote({
height: 300, // set editor height
minHeight: null, // set minimum height of editor
maxHeight: null, // set maximum height of editor
focus: true // set focus to editable area after initializing summernote
});

3.前端引入:

1
<div id="summernote">Hello Summernote</div>
1
注:具体的js以及前段的写法请参考官网

4.地址回调(返回图片的存储路径)

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
放在初始化文件中:
callbacks: {
onImageUpload: function (files, editor, $editable) {
send(files);
}
//上传图片
function send(files, editor, $editable) {
var data = new FormData();
data.append("ajaxTaskFile", files[0]);
//文件上传大小
if (files[0].size >= 1048576) {
return $.gritter.add({
text: '照片最大尺寸为1M,请重新上传!',
class_name: 'success',
time: 4000
});
}
$.ajax({
data: data,
type: "POST",
url: "/uploads", //图片上传出来的url,返回的是图片上传后的路径,http格式
cache: false,
contentType: false,
processData: false,
dataType: "json",
success: function (data) {//data是返回的hash,key之类的值,key是定义的文件名
if (data.flag == 1) {
return $.gritter.add({
text: data.info,
class_name: 'success',
time: 4000
});
}
$('#summernote').summernote('insertImage', data.url);
return false;
},
error: function () {
alert("上传失败");
}
});
}

5.将图片的源放到框架的某个目录下(没有目录则自动创建)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
在Yii框架下(modles):
public function uploads()
{
$imgPath = $this->createPath;
$result = $this->createCatalog($imgPath);
if ($this->validate() && $result) {
$this->imagePath = '//' . date('YmdHis') . $this->imageFile->baseName . '.' . $this->imageFile->extension;
$relpath = date('YmdHis') . $this->imageFile->baseName . '.' . $this->imageFile->extension;
$path = Yii::$app->BasePath . '/web' . $this->imagePath;
if ($this->imageFile->saveAs($path)) {
$servicePath = $this->serviceUp($path, $relpath);
return $servicePath;
}
} else {
return false;
}
}

目录创建

1
2
3
4
5
6
7
8
9
10
11
12
public function createCatalog($path)
{
if (!file_exists($path)) {
$res = mkdir("$path", 0755, true);
if (!$res) {
throw new CustomerException('创建存放图片目录失败没有权限……');
}
return true;
} else {
return true;
}
}

1
注:详细了解 进入官网(http://summernote.org/)

为了预防在集群下多服务器,图片上传丢失,没有路径的问题。指定特定的ftp用来存储图片文件源。

1.ftp_connect() 函数建立一个新的 FTP 连接。

1
2
3
4
5
6
7
8
若成功,则返回一个连接标识,否则返回 false。
>ftp_connect(host,port,timeout)
| 参数 | 描述 |
|---- |:----------------------------------------------:|
| host | 必需。规定要连接的 FTP 服务器。可以是域名或 IP 地址。|
| port |可选。规定 FTP 服务器的端口。 |
|timeout| 可选。规定该 FTP 服务器的超时时间。默认是 90 秒。 |

2.ftp_login() 函数登录 FTP 服务器。。

1
2
3
4
5
6
7
若成功则返回 true,失败则返回 false 并发出一个警告。
>ftp_login(ftp_connection,username,password)
| 参数 | 描述 |
|-------|:----------------------------------------------:|
| ftp_connection | 必需。规定要使用的 FTP 连接(FTP 连接的标识符)|
| username |必需。规定用于登录的用户名。| |
|password|必需。规定用于登录的密码。 |

3.ftp_pasv() 函数把被动模式设置为打开或关闭。

1
2
3
4
5
6
7
8
在被动模式中,数据连接是由客户机来初始化的,而不是服务器。这在客户机位于防火墙之后时比较有用。
>ftp_pasv(ftp_connection,mode)
| 参数 | 描述 |
|-------|:----------------------------------------------:|
| ftp_connection | 必需。规定要使用的 FTP 连接(FTP 连接的标识符)|
| mode |必需。规定模式。 |
|-------|TRUE = passive mode on |
|-------|FALSE = passive mode off |

4.ftp_put() 函数把文件上传到服务器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
若成功则返回 true,失败则返回 false。
>ftp_put(ftp_connection,remote,local,mode,resume)
| 参数 | 描述 |
|-------|:----------------------------------------------:|
| ftp_connection | 必需。规定要使用的 FTP 连接(FTP 连接的标识符)|
| remote |必需。上传到服务器上的文件名。 |
| local |必需。规定要上传的本地文件的路径。 |
| mode | 必需。规定传输模式。可能的值有: |
|-------| FTP_ASCII |
|-------| FTP_BINARY |
| resume| 必需。规定在本地文件中的何处开始拷贝。默认是 0。|
注:
如果没后目录,默认 '/'时:
例如:上传 a.png 10.8.217.161 ftp上
则:remote:a.png
此处有坑:
在mode中选择模式:
----
ASCII模式用来传输文本文件,其他文件的传输使用binary模式。

5.具体实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public function serviceUp($localPath, $servicePath)
{
try {
$conn = ftp_connect($this->ftpAddress);
$result = ftp_login($conn, 'ftpName', 'ftpPwd');
ftp_pasv($conn, true);
if (ftp_put($conn, $servicePath, $localPath, FTP_BINARY)) {
return true;
} else {
return false;
}
ftp_close($conn);
} catch (\Exception $e) {
throw new CustomerException($e->getMessage());
}
}

docker现在有多火呢?现在只要说到云就在说docker,说到docker就是容器,就是虚拟机。就是快速部署和复制,其实对于我们大多数的PHP的小伙伴来说真是没有多大用处。

由于windows问题太多,我们此篇文章不讲windows下的安装,简单的谈谈linux下。

我们今天将要实现的方式是使用vagrant来部署自己的开发环境,使用vagrant部署开发环境最大的好处是快速,完全隔离。并且两边操作互不影响。

###我个人推荐下载使用:

下载安装 VirtualBox :https://www.virtualbox.org/

下载安装 Vagrant :http://www.vagrantup.com/

先安装:VirtualBox 这是一个开源的虚拟机,很好用。不用担心有授权和破解问题。

再安装上vagrant,之后的就是重点了。

下载这样一个box,我们叫做盒子:https://atlas.hashicorp.com/laravel/boxes/homestead

然后执行vagrant box add laravel/homestead 下载路径的box名

在某个目录中执行git clone https://github.com/laravel/homestead.git Homestead

###执行bash init.sh

1
配置ssh-keygen -t rsa -C "you@homestead"

###修改一下IP地址哟和配置文件,我们进行主要部份的讲解:

folders:

//本地目录

1
- map: ~/Code

//映射到远程目录的地址

1
to: /home/vagrant/Code

sites:

//这是站点的别名

1
- map: homestead.app

//这是服务器端的web可以访问的根目录

1
2
to: /home/vagrant/Code/Laravel/public

配置完成了。

###现在你可以试试了:

vagrant up就启动了我们的容期服务器。
``
你可以通过 ssh vagrant@IP 地址,就连接到服务器了。

你可以试试操作~/Code目录,看看代码是不是自动上传到了虚拟服务器上了。

改改hosts文件,将homestead.app指向虚拟的IP地址,一切就OK了。

下面的是重点,我们根据网友的提问总结了经常遇到的问题:

vagrant up启动的时候提示IP错误,怎么办?

vagrant遇到的Couldn’t open file/Users/xiaohuan/base

执行vagrant up时遇到的怪问题

vagrant up时遇到的问题HTTP server doesn’t seem to support byte ranges. Cannot resume.

1
vagrant ./box-disk1.vmdk gzip decompression failed badtar:error exit delayed from previous errors

PHP发布5.6版本后,一直在等,等到了跨越式的PHP7版本,那么问题来了,版本6到哪去了?根据官方的说法现在的PHP7要比PHP5.6快一倍,有的朋友说快十倍,反正是更快了,本人虽然不习惯Mac系统,因为工作原因,不得不使用啊,本人也是刚刚使用,被坑淹了好几次,最近一直在关注这一块,Mac系统如何安装PHP7!
一般有好几种方法来安装。
一,我们可以去官网上下源码去编译,我也尝试这种方法了,但是最后编译安装make test,这一步的时候,报错,于是就大胆尝试第二种方法吧!
二,使用第三方包homebrew来安装,非常迅速有效!

安装教程:首先我们需要安装Homebrew

一条命令完美安装:http://brew.sh/index_zh-cn.html

1.终端输入以下命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 创建目录,如果你没有创建过该目录
sudo mkdir /usr/local/var
sudo chmod 777 /usr/local/var
//修改成你自己的用户名和组,如果你没有创建过该目录
sudo mkdir /usr/local/sbin/
sudo chown -R <username>:<group> /usr/local/sbin//由于我本身一直在使用5.6版本,故上述步骤省略,下面进入正题
//添加PHP库
brew tap homebrew/dupes
brew tap homebrew/versions
brew tap homebrew/homebrew-php
//关闭老版本的PHP56或55或更早版本 进程
brew unlink php56
//开始安装PHP7
brew install php70
//开启PHP70进程
brew link php70
//输入命令,查看是否成功
php -v
//成功后显示下面信息
PHP 7.0.8 (cli) (built: Jul 13 2016 15:19:21) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

2.修改Apache配置文件

1
2
3
4
sudo vim /etc/apache2/httpd.conf
//找到大约168行,该语句,屏蔽后,根据自己的路径,添加php7的.so文件
#LoadModule php5_module libexec/apache2/libphp5.so
LoadModule php7_module /usr/libexec/apache2/libphp7.so

说明一下,我的libphp7.so文件目录是这个,好像是默认安装的结果

1
LoadModule php7_module /usr/local/Cellar/php70/7.0.0-rc.4/libexec/apache2/libphp7.so

3.重启Apache

1
sudo apachectl restart

4.如果发现php文件直接输出到浏览器了,那么你需要修改以下配置

1
sudo vim /etc/apache2/httpd.conf

找到 Include /private/etc/apache2/other/*.conf 这行
进入此文件
将文件内容,修改为以下代码:

1
2
3
4
5
6
7
<IfModule php7_module>
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
</IfModule>

5.再次重启apache,重复第4步

到你的Apache的默认目录/Library/WebServer/Documents下面去增加一个info.php的文件。

1
2
3
<?php
phpinfo();
?>

http://localhost/info.php久违的画面,应该已经在眼前!

那么问题来了,安装后可能导致之前的工程无法访问了,排查一下,mysql出问题了,那么只需重启一下你的mysql即可!

1
sudo /Library/StartupItems/MySQLCOM/MySQLCOM restart

最后

告知一下,Mac如何将mysql路径加入环境变量

1.打开终端,输入: cd ~

会进入~文件夹

2.然后输入:touch .bash_profile

回车执行后,

2.再输入:open -e .bash_profile

会在TextEdit中打开这个文件(如果以前没有配置过环境变量,那么这应该是一个空白文档)。如果有内容,请在结束符前输入,如果没有内容,请直接输入如下语句:

export PATH=${PATH}:/usr/local/mysql/bin

示例

先来看一个小示例:

1
2
3
4
5
6
<?php
$needle = '1abc';
$haystack = array(1,2,3);
var_dump(in_array($needle, $haystack);
//输出为 true
?>

解释

根据官方文档函数 in_array 的描述:

1
bool in_array ( mixed $needle , array $haystack , [ bool $strict = FALSE ] )

在 haystack 中搜索 needle,如果没有设置 strict 则使用宽松的比较。
第三个参数默认为 false,当 $needle 和 $haystack 中的元素比较时会进行类型转换,相当于使用 == 进行比较。

总结

in_array()第三个参数决定变量和数组中元素如何进行比较。值为 false(默认值)时,相当于 ==,值为 true 时,相当于 ===。