【原创】Yii2使用swiftMailer发送QQ邮件

今天想在监控上做一个yii2使用qq邮箱发送邮件的功能。

一、安装swiftMailer扩展

默认yii 2.0会有这个扩展,如果没有就安装。

composer require –prefer-dist yiisoft/yii2-swiftmailer

或者修改composer.json,require加入: “yiisoft/yii2-swiftmailer”: “*”,

二、开启QQ邮箱IMAP/STMP服务

进入你的QQ邮箱,进入账户界面->设置->账户->开启服务:IMAP/SMTP服务

这里的意思是可以使用imap.qq.com作为邮件接收服务器,smtp.qq.com作为邮件发送服务器。

IMAP是什么?
IMAP,即Internet Message Access Protocol(互联网邮件访问协议),您可以通过这种协议从邮件服务器上获取邮件的信息、下载邮件等。IMAP与POP3类似,都是一种邮件获取协议。区别就是一个有消息反馈,一个没反馈。

根据页面要求发送短信开启后可以获取授权码,相当于发送账号的密码,记得保存下来。

三、修改yii2配置文件

我是修改了advanced\common\config\main-local.php,加入以下内容:

<?php
return [
    'components' => [
      'mailer' => [
         'class' => 'yii\swiftmailer\Mailer',
         'useFileTransport' =>false,//这句一定有,false发送邮件,true只是生成邮件在runtime文件夹下,不发邮件
         'transport' => [
            'class' => 'Swift_SmtpTransport',
            'host' => 'smtp.qq.com',  //每种邮箱的host配置不一样
            'username' => 'xxx@qq.com',//用发送开启了功能的邮箱
            'password' => 'xxxxxx',//授权码
            'port' => '465',
            'encryption' => 'ssl',

         ],
         'messageConfig'=>[
            'charset'=>'UTF-8',
            'from'=>['xxx@qq.com'=>'admin']
         ],
      ],

四、控制器或命令行编写发送代码

$url='http://www.jd.com/';
$mail= Yii::$app->mailer->compose();
$mail->setTo('xxx@foxmail.com');
$mail->setSubject("上架了");
//$mail->setTextBody('zheshisha ');   //发布纯文字文本
$mail->setHtmlBody("<br>商品:<a href='".$url."' target='_blank'>购买地址</a>");    //发布可以带html标签的文本
if($mail->send())
 echo "success";
else
 echo "failse";

//批量多发
$users = ['xxx1@qq.com', 'xxx2@qq.com']; 
$messages = []; 
foreach ($users as $user) {
 $messages[] = Yii::$app->mailer->compose() 
 ->setTo($user) 
 ->setSubject('测试主题') 
 ->setHtmlBody('测试内容'); 
} 
Yii::$app->mailer->sendMultiple($messages);

还可以模板方式,发送附件等,具体看官方文档:

https://www.yiiframework.com/doc/guide/2.0/en/tutorial-mailing

 

发表在 服务器 | 标签为 , | 留下评论

【原创】港版ipad2018 ios11忘记功能限制的密码

ipad2018港版为了孩子使用设置了一个密码,结果直接却忘记了。找半天,刷机和远程iCloud抹掉都不适合我会丢失数据,尝试修改备份文件添加密码恢复失败,恢复过程老是中断。最后发现一个老外网站可以很容易解决问题。

iOS7-iOS11 采用pbkdf2-hmac-sha1加密, 非常强壮,可是因为一般密码只有(0000 to 9999) 4位非常简单又短的数字,所以还是非常快就能匹配出来的。

但是目前看应该不适合ios12,因为IOS12最终将限制代码移到了IOS钥匙链中!还好我还没升级到最新版。不然就只能重新刷机或抹掉数据了。希望你们也还没升级!

我windows7

1、ipad连接电脑,打开itunes,备份你的ipad到本地(不要加密)。
xp的文件备份目录是C:\Users\Administrator\Application Data\Apple Computer\MobileSync\Backup,其他系统请问度娘。

2、下载iBackupBot for iTunes软件

3、打开iBackupBot for iTunes软件,点打开文件,找到备份目录。

4、打开左边窗口的目录,点system files,在右边的窗口中的搜索框中录入com.apple.restrictionspassword.plist回车。

5、点击此文件(会弹出注册窗口,点cancel)

 <dict>
 <key>RestrictionsPasswordKey</key>
 <data>
 FklNcq4P3mJYSNjDFWvv2ei2+uE=
 </data>
 <key>RestrictionsPasswordSalt</key>
 <data>
 aSbUXg==
 </data>
 </dict>

打开网站:http://ios7hash.derson.us/

把对应的RestrictionsPasswordKey和RestrictionsPasswordSalt输入到对应的文本框内,点击start searching搜索。最后发现密码就是: 0020,简单吧。

详细内容还是看看老外怎么解释吧。

 

发表在 服务器 | 标签为 | 留下评论

yii2打印print_r、var_dump、echo出现Headers already sent in错误

yii2在打印输出的时候遇到奇葩错误问题;

An Error occurred while handling another error:
yii\web\HeadersAlreadySentException: Headers already sent in

因为Yii2输出模板的时候触发了Yii Response类的异常。

方法选一个:

1、可以在action或函数的开始加

Yii::$app->response->send();

2、在结束结尾加die或者exit可以解决

 

发表在 服务器 | 标签为 | 留下评论

【原创】phpstudy在window下nginx支持php多版本

由于项目使用一些不同的扩展和框架,而对php的版本支持又不同,所以需要多版本运行项目。

由于我原来使用的就是phpstudy来搭建php环境的,nginx整合各个php免安装版本Non Thread Safe(nts)都有了。

当然你可以上http://windows.php.net/download下载最新版。

phpstudy运行的是php5.5n版本,需要运行更多一个php7的版本,phpstudy网上都是说使用apache实现,我的配置都在nginx下,不想动。

需要RunHiddenConsole,用于启动php-cgi,可以实现关闭窗口依然在后台运行。解压后放在phpstudy目录下就可以了。
http://redmine.lighttpd.net/attachments/660/RunHiddenConsole.zip

配置nginx

在要使用php7的修改nginx.conf配置文件中将请求发送到9001端口。

location ~ \.php$ {
 fastcgi_index /index.php;
 fastcgi_pass 127.0.0.1:9001;
 include fastcgi_params;
 fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
 fastcgi_param PATH_INFO $fastcgi_path_info;
 fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 }

php7由于phpstudy都自带的,找到对应的目录就可以了。

启动脚本

在phpstudy目录下新建启动脚本start.bat。让php7启动在9001端口。

@ECHO OFF

ECHO Starting PHP7.0 FastCGI...
RunHiddenConsole.exe E:/phpStudy/php70n/php-cgi.exe -b 127.0.0.1:9001

新建关闭脚本stop.bat。可以用以下代码关闭,也可以直接用phpstudy关闭。

@ECHO OFF

ECHO Stoping PHP FastCGI...
taskkill /F /IM php-cgi.exe > nul

这里麻烦的就是一旦使用phpstudy重启的时候,必须使用start.bat命令启动下php7,当然你自己也可以写个nginx+mysql+php一起重启关闭的bat批处理命令,这样就不用使用phpstudy来操作了。

 

 

发表在 服务器 | 标签为 | 留下评论

php7安装memcache扩展windows

memcache扩展最高只支持php版本5.x,后面都不维护了。

http://pecl.php.net/package/memcache

这时候就需要老外帮忙了

https://stackoverflow.com/questions/34952502/memcache-for-php7-on-windows

git下载地址:https://github.com/nono303/PHP7-memcache-dll

下载对应的版本扩展放入php-7.0.12-nts\ext目录
打开php.ini 配置文件增加行 : extension=php_memcache.dll
重启下就可以了 php -m查看扩展加载了吗

发表在 服务器 | 标签为 , | 留下评论

【原创】冒泡排序和选择排序区别

两种排序算法都是2次for循环,每一轮都把最大或最小的元素筛选出来放在相应的位置上,时间复杂度为O(n^2),空间复杂度为O(1)。

但交换的次数,选择排序是更少的 ,所以一般选择排序更快一点,冒泡排序是每一次都可能要左右交换,而选择排序是在比较时记录下标的位置最后来交换。

但是选择排序是不稳定的排序方法(比如序列[3, 3, 2]第一次就将第一个[3]与[2]交换,导致第一个3挪动到第二个3后面)。

 

发表在 服务器 | 标签为 | 留下评论

php读取nginx日志ip去重统计访问记录数

最近为了统计nginx下访问日志中至少百万记录的ip访问频率,日志文件大概500m,200多万条访问记录,经过测试速度还可以,当日志文件上1G就开始明显慢了,统计6G多的日志文件1500万条访问记录,本地机器需要30秒。尝试采用fread分流读取处理后效率也是差不多,暂时没找到更好方法,有更好的麻烦留言交流,感谢。

代码如下:

ini_set('display_errors',1); //错误信息
ini_set('display_startup_errors',1); //php启动错误信息
error_reporting(E_ALL & ~E_NOTICE ); //打印出所有的 错误信息

$result = array();
$fp = fopen('upstream.log', 'r');
$num = 0; //行数
while(!feof($fp))
{
 $line = fgets($fp);//指针方式读取一行
 $line = trim($line);
 $line = trim($line, "\r");
 $line = trim($line, "\n");
 
 $ip = substr($line, 0, strpos($line, '- -')-1);//提取ip
 if($ip == ''){
  continue;
 }
 $result[$ip] = $result[$ip]+1;
 $num++;
}
fclose($fp);

echo $num;//总行数
arsort($result);//排序
echo '<pre>';
print_r(array_slice($result, 0, 30));//前30条
exit;
发表在 服务器 | 标签为 , | 留下评论

centos6一键安装Redmine

安装准备

1,Linux系统:CentOS release 6.8 (Final) 64位 2.6.32-642.el6.x86_64

2,Redmine安装包:

wget https://downloads.bitnami.com/files/stacks/redmine/3.4.3-2/bitnami-redmine-3.4.3-2-linux-x64-installer.run

wget https://bitnami.com/redirect/to/354032/bitnami-redmine-3.4.6-4-linux-x64-installer.run

官网:https://bitnami.com/stack/redmine/installer

给.run文件加执行属性 chmod +x

这里执行 ./bitnami-redmine-3.4.3-2-linux-x64-installer.run 安装

根据需要安装组件,然后设置账号密码,成功后会有访问地址给你。

流程如下:

********************************************************************
[root@localhost src]# ./bitnami-redmine-3.4.3-2-linux-x64-installer.run
Language Selection

Please select the installation language
[1] English – English
[2] Spanish – Español
[3] Japanese – 日本語
[4] Korean – 한국어
[5] Simplified Chinese – 简体中文
[6] Hebrew – עברית
[7] German – Deutsch
[8] Romanian – Română
[9] Russian – Русский
Please choose an option [1] : 5
—————————————————————————-
欢迎来到 Bitnami Redmine Stack 安装程序。

—————————————————————————-
选择您想要安装的组件,清除您不想安装的组件。当您准备继续时,点击前进。

Subversion [Y/n] :n

PhpMyAdmin [Y/n] :y

Redmine : Y (Cannot be edited)

Git [Y/n] :y

上述选择是否正确? [Y/n]: y

—————————————————————————-
安装文件夹

请选择安装Bitnami Redmine Stack的文件夹

选择一个文件夹 [/opt/redmine-3.4.3-2]: /data/redmine-3.4.3-2

—————————————————————————-
创建管理员帐户

Bitnami Redmine Stack admin 用户创建

您的真实姓名 [User Name]: ken

Email地址 [user@example.com]: admin@netpc.com.cn

登录 [user]: admin

密码 :
请确认密码 :
—————————————————————————-
Web服务器端口

Choose a port that is not currently in use, such as port 81.

Apache Web 服务端口 [81]:

—————————————————————————-
MySQL信息

请输入MySQL数据库信息

Choose a port that is not currently in use, such as port 3307.

MySQL服务端口 [3307]:

—————————————————————————-
缺省数据配置语言

选择缺省数据配置语言:

[1] Bosnian
[2] 保加利亚语
[3] Catalan
[4] 捷克语
[5] Danish
[6] 德语
[7] 英语
[8] 西班牙
[9] 法语
[10] Galician
[11] 希伯来语
[12] Hungarian
[13] 意大利语
[14] 日语
[15] 朝鲜语
[16] Lithuanian
[17] 荷兰语
[18] Norwegian
[19] 波兰语
[20] 葡萄牙语
[21] 罗马尼亚语
[22] 俄语
[23] Slovak
[24] Slovenian
[25] 塞尔维亚语
[26] 瑞典语
[27] Turkish
[28] Ukrainian
[29] Vietnamese
[30] 中文
请选择选项 [30] :

Do you want to configure mail support? [y/N]: n

—————————————————————————-
安装程序已经准备好将 Bitnami Redmine Stack 安装到您的电脑。

您确定要继续吗? [Y/n]: y

—————————————————————————-
正在安装 Bitnami Redmine Stack 至您的电脑中,请稍候。

正在安装
0% ______________ 50% ______________ 100%
#########################################

—————————————————————————-
安装程序已经将 Bitnami Redmine Stack 安装于您的电脑中。

启动Redmine应用程序。 [Y/n]: y

信息: To access the Bitnami Redmine Stack, go to
http://127.0.0.1:81 from your browser.

Redmine启动或重启脚本

./ctlscript.sh start|restart

********************************************************************

安装中出现的错误

一、glibc2.18 not fund:这是glibc也就是C库版本不到2.18,需要升级:

1.下载:http://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz

选择报错中需要的版本:glibc-2.18.tar.gz
选择过最新版本,安装时候进行configure时候报错,所以就没有最新版本
2.解压:tar -xf glibc-2.18.tar.gz
3.编译安装:
[root@localhost soft]# cd glibc-2.18
[root@localhost glibc-2.18]# mkdir build; cd build
[root@localhost build]# ../configure –prefix=/usr –disable-profile –enable-add-ons –with-headers=/usr/include –with-binutils=/usr/bin
[root@localhost build]# make -j 8
[root@localhost build]# make install

3)检查:
[root@localhost soft]# strings /lib64/libc.so.6 | grep GLIBC

二、Glibcxx3.4.18 not fund:这是glibcxx也就是C++库版本不到3.4.18,需要升级:

1,下载:
ftp://ftp.de.debian.org/debian/pool/main/g/gcc-8/libstdc++6_8.2.0-9_amd64.deb
选择报错中需要的版本:libstdc++6_8.2.0-9_amd64.deb 这是目前最新的版本

如果版本404就上ftp://ftp.de.debian.org/debian/pool/main/g/gcc-8/去找

2,运行以下命令安装:
1)解压:
ar -x libstdc++6_8.1.0-10_amd64.deb
xz -d data.tar.xz
tar -xvf data.tar

2)安装:
删除:rm /usr/lib64/libstdc++.so.6
拷贝:cp usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25   /usr/lib64/
链接:ln  /usr/lib64/libstdc++.so.6.0.25  /usr/lib64/libstdc++.so.6

3)检查:

[root@localhost soft]# strings /usr/lib64/libstdc++.so.6 |grep GLIBCXX

以上如果lib/libstdc++.so.6有这个文件,而你没有更新版本,需要删除掉,不然安装的时候首先会去调用lib下的文件依旧导致出错。

发表在 服务器 | 标签为 | 留下评论

swoole的应用场景用在什么地方

  • 协程异步,提高对 I/O 密集型场景并发处理能力(如:微信开发、支付、登录等)IM系统(用于直播页面的聊天通讯)swoole_websocket_server创建WebSocket服务器
  • 方便地开发 Http、WebSocket、TCP、UDP 等应用,可以与硬件设备连接通讯(定位设备) 实时收集定位数据实时输出(例:行驶轨迹)常驻内存,避免重复加载带来的性能损耗,提升海量性能。swoole_server创建TCP服务器
  • 高性能微服务架构
  • 异步消息发送(短信、邮件等)swoole_server创建TCP服务器
  • 毫秒定时
  • 做server迷你nginx等

swoole_http_server是swoole_server的子类,内置了Http的支持
swoole_websocket_server是swoole_http_server的子类, 内置了WebSocket的支持

swoole环境依赖
https://wiki.swoole.com/wiki/page/7.html

swoole编译安装

https://wiki.swoole.com/wiki/page/6.html

swoole快速起步

https://wiki.swoole.com/wiki/page/p-quickstart.html

 

发表在 服务器 | 标签为 | 留下评论

IP、TCP、UDP、HTTP、WebSocket、SOCKET之间的关系和区别

学通讯先搞清楚各种协议和通信层、套接字等。

看看标准的七层模型,亦称OSI(Open System Interconnection)参考模型

7 应用层 例如HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP
6 表示层 例如XDR、ASN.1、SMB、AFP、NCP
5 会话层 例如ASAP、TLS、SSH、ISO 8327 / CCITT X.225、RPC、NetBIOS、ASP、Winsock、BSD sockets
4 传输层 例如TCP、UDP、RTP、SCTP、SPX、ATP、IL
3 网络层 例如IP、ICMP、IGMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、 X.25
2 数据链路层 例如以太网、令牌环、HDLC、帧中继、ISDN、ATM、IEEE 802.11、FDDI、PPP
1 物理层 例如线路、无线电、光纤、信鸽

简化的TCP/IP四层模型主要分为:应用层、传输层、网络层、数据链路层。

大家对照着协议和层自己看看。上一层都是建立在下一层的基础上。

IP:网络层协议;(高速公路)

TCP和UDP:传输层协议;(卡车)

HTTP:应用层协议;(货物)。HTTP(超文本传输协议)是建立在TCP协议之上的一种应用。HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

SOCKET:套接字,TCP/IP网络的API。(港口码头/车站)Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。

Websocket:同HTTP一样也是应用层的协议,但是它是一种双向通信协议,是建立在TCP之上的,解决了服务器与客户端全双工通信的问题,包含两部分:一部分是“握手”,一部分是“数据传输”。握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。

注:什么是单工、半双工、全工通信?
数据只能单向传送为单工;
数据能双向传送但不能同时双向传送称为半双工;
数据能够同时双向传送则称为全双工。

TCP/UDP区别
TCP(传输控制协议,Transmission Control Protocol):(类似打电话)
面向连接、传输可靠(保证数据正确性)、有序(保证数据顺序)、传输大量数据(流模式)、速度慢、对系统资源的要求多,程序结构较复杂,
每一条TCP连接只能是点到点的,
TCP首部开销20字节。
UDP(用户数据报协议,User Data Protocol):(类似发短信)
面向非连接 、传输不可靠(可能丢包)、无序、传输少量数据(数据报模式)、速度快,对系统资源的要求少,程序结构较简单 ,
UDP支持一对一,一对多,多对一和多对多的交互通信,
UDP的首部开销小,只有8个字节。

Socket和WebSocket区别
Socket 其实并不是一个协议。它工作在 OSI 模型会话层(第5层),是为了方便大家直接使用更底层协议(一般是 TCP 或 UDP )而存在的一个抽象层。
而 WebSocket 则不同,它是一个完整的应用层协议,包含一套标准的 API 。
WebSocket 更易用,而 Socket 更灵活。

WebSocket与HTTP的区别
相同点:
1. 都是一样基于TCP的,都是可靠性传输协议。
2. 都是应用层协议。

不同点:
1. WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息。HTTP是单向的。
2. WebSocket是需要握手进行建立连接的。

WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的。

发表在 服务器 | 标签为 | 留下评论