其实这种发送邮件是非常的简单了我们只要接受由用户提交过来的邮箱地址然后再由php的邮件控制进行邮件发送了,下面看一个综合开发例子。
首先yyuc框架是支持发送email的
在yyuc/yyuc.php 上加上如下代码:
代码如下 |
复制代码 |
require_once(YYUC_LIB.'plugin/SendMail.php');
$sendMail = new SendMail();
|
二在wx conf.php 下配置下发送函数
代码如下 |
复制代码 |
public static $email = array(
'reg'=>array('protocol'=>'smtp','smtp_host'=>'smtp.qq.com','smtp_user'=>'','smtp_pass'=>'','from'=>array('','注册信息')),
'findpwd'=>array('protocol'=>'smtp','smtp_host'=>'smtp.qq.com','smtp_user'=>'','smtp_pass'=>'','from'=>array('','密码找回'))
);
|
三 在相应的位置加上如下代码
代码如下 |
复制代码 |
//
$wid=Session::get('wid');;
$pubs=new Model('pubs');
$pubs->field('uid')->find(array('id'=>$wid));
$uid=$pubs->uid;
$user=new Model('micro_car_yysj');
$user->field('noticeemailon,noticeemail')->find(array('uid'=>$uid));
$noticeemailon=$user->noticeemailon;
$noticeemail=$user->noticeemail;
if($noticeemailon=="1"){
sendMail::normal_send("reg", $noticeemail, "您好,您在系统有有预约试驾的用户", "您好,您在系统有有预约试驾的用户,请登录系统查看" ,$toname = '');
}
//
|
下面给大家整理了个php上传cvs文件完整例子,希望此例子对各位同学会有所帮助自己没注意看不知道什么原因要上传csv文件哦。
html代码:
代码如下 |
复制代码 |
<form action="/message/index/csv" encType="multipart/form-data" method="post" target="uploadcvs">
<div><input type="file" name="csvfile"/> <input type="submit" value="上传"></div>
<div id="upload_info" style="width:100%;border:1px solid #809db9;display:none" ></div>
</form>
|
target="uploadcvs",添加target时调试代码不好调试,建议调试时去掉这行代码
php代码:
代码如下 |
复制代码 |
public function csvAction(){
//获取上传文件名$fileinfo,包含文件的扩展
$fileinfo = pathinfo($_FILES['csvfile']['name']);
//判断文件扩展是不是csv
if(!in_array(strtolower($fileinfo['extension']),array('csv'))){
$feed = array('status'=>'ext');
//判断文件的大小
}else if($_FILES['csvfile']['size'] > 1*1024*1024){
$feed = array('status'=>'size');
}else{
//成功时数组
$succdata = array();
//错误时数组
$errdata = array();
//计数,计算多少行
$count = 0;
//打开临时文件,只读形式
$handle = fopen($_FILES['csvfile']['tmp_name'],"r");
//获取数据库中的username信息
$userMongo = new Application_Model_DbTable_MongoUsers();
$dbUsers = $userMongo->findAll(array(),array('login.username'=>true));
//把用户的username信息写入$users
$users = array();
foreach($dbUsers as $user){
if(isset($user['login']['username']))
$users[] = $user['login']['username'];
}
//逐行读取csv文件信息fgetcsv,fgetcsv($handle)
while ($row = fgetcsv($handle)) {
//读一行count就累加,这样就可以知道读了多少行
$count ++ ;
foreach($users as $user){
//判断$row[0]是不是手机号&&$row[0]是不是等于$user也就是$users中是否有这条记录
//判断成功时,把这条手机号写入数组$succdata
if(preg_match('/^1(3|4|5|8)d{9}$/',$row[0]) && $user==$row[0]){
$succdata[$row[0]] = (string)$row[0];
break;
}
}
//判断$succdata[$row[0]]是否存在,不存在写入$errdata
if(!isset($succdata[$row[0]])){
$errdata[$row[0]] = $row[0];
}
}
//关闭文件
fclose($handle);
//把上传的cvs文件存到自己的项目中
$url = $this->_helper->Upload->msgcsv($_FILES['csvfile'], $succdata, $errdata);
//$count信息是关于csv文件有多少行记录,成功多少行,失败多少行
$count = array('original'=>$count, 'success'=>count($succdata), 'error'=>count($errdata));
//$feed,这里状态是成功的,count, 与 url 。
//count是为了查看是否有失败的,url是为了查看失败的列表信息(因为上传时换回了3个文件,查看失败文件)
$feed = array('status'=>'succ','count'=>$count, 'url'=>$url);
}
//把数组json化 json_encode() json_encode()json编码
$feed = json_encode($feed);
//callback()函数 <script>parent.callback(".$feed.")</script>
echo "<script>parent.callback(".$feed.")</script>";
exit;
}
|
js代码:
代码如下 |
复制代码 |
//data就是".$feed."
function callback(data){
try{
if(data.status =='ext'){
alert('文件类型不正确');
return false;
}else if(data.status == 'size'){
alert('文件不能超过1M');
return false;
}else if(data.status == 'succ'){
//parseInt将字符串转化为整型 parseInt
var html = parseInt(data.count.error) > 0 ? ' <a href="<?php echo UPLOAD_IMAGE_PATH;?>'+data.url.error+'">查看失败列表</a>' : '';
//成功的条数,失败的条数
$('#upload_info').html('成功导入:'+data.count.success+';失败:'+data.count.error+html);
$('#upload_info').show();
$('input[name=step3_hidden]').val(data.url.success);
}
}catch(e){
alert('解析出错,请检查文件格式.');
}
return false;
}
|
Upload.php文件
代码如下 |
复制代码 |
<?php
//上传处理
class Ata_Controller_Action_Helper_Upload extends Zend_Controller_Action_Helper_Abstract {
//通知csv文件
public function MsgCsv(&$source, $succdata, $errdata){
//原cvs保留
//文件存放目录
$publicPath = realpath(APPLICATION_PATH."/../public/upload").'/';
$csvPath = "msgcsv/".date('Y').'/'.date('m')."/";
$path = $publicPath.$csvPath;
//创建目录
$this->mkdirs($path);
//uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。uniqid()
$filename = uniqid();
//获取文件的扩展名
$ext = pathinfo($source['name'], PATHINFO_EXTENSION);
//创建空文件,目录,文件名,扩展
$filepath = $path.$filename.'_org.'.$ext;
//move_uploaded_file(),将上传的文件移动到新位置
move_uploaded_file($source['tmp_name'], $filepath);
//正确csv创建
$content = '';
//创建空文件,目录,文件名,扩展
$succfile = $path.$filename.'_succ.'.$ext;
//把$succdata的内容写入$content;
foreach($succdata as $row){
//连接字符串等同$content = $content.$row."n"
$content .= $row."n";
}
$content = trim($content,"n");
//file_put_contents(),把一个字符串写入文件中
file_put_contents($succfile, $content);
//错误csv创建
$content = '';
$errfile = $path.$filename.'_err.'.$ext;
foreach($errdata as $row){
$content .= $row."n";
}
$content = trim($content,"n");
file_put_contents($errfile, $content);
//返回3个文件(用于查看失败列表与把成功的列表内容写入隐藏域中传递到数据库中)
return array(
'orginal' => $csvPath.$filename.'_org.'.$ext,
'success' => $csvPath.$filename.'_succ.'.$ext,
'error' => $csvPath.$filename.'_err.'.$ext
);
}
//删除文件
//获取csv文件的前缀名
public function rmMsgCsv($path){
//$prefix获取csv文件的前缀名
$prefix = str_replace('_succ.csv','',$path);
//删除三个文件
unlink($prefix.'_org.csv');
unlink($prefix.'_succ.csv');
unlink($prefix.'_err.csv');
}
public function mkdirs($dir, $mode = 0777) {
return is_dir($dir) or ($this->mkdirs(dirname($dir)) and mkdir($dir, $mode));
}
}
|
需求如下: 现有一个1G左右的日志文件,大约有500多万行, 用php返回最后几行的内容,如果我们使用常用的方法估计就直接卡死了,后看到一站长写了这文章整理了一下使用起来非常的不错。
实现方法:
1. 直接采用file函数来操作
注: 由于 file函数是一次性将所有内容读入内存,而php为了防止一些写的比较糟糕的程序占用太多的内存而导致系统内存不足,使服务器出现宕机,所以默认情况下 限制只能最大使用内存16M,这是通过php.ini里的memory_limit = 16M来进行设置,这个值如果设置-1,则内存使用量不受限制.
下面是一段用file来取出这具文件最后一行的代码.
整个代码执行完成耗时 116.9613 (s).
代码如下 |
复制代码 |
ini_set('memory_limit','-1');
$file = 'access.log';
$data = file($file);
$line = $data[count($data)-1];
echo $line;
|
我机器是2个G的内存,当按下F5运行时,系统直接变灰,差不多20分钟后才恢复过来,可见将这么大的文件全部直接读入内存,后果是多少严重,所以不在万不得以,memory_limit这东西不能调得太高,否则只有打电话给机房,让reset机器了.
2.直接调用linux的tail命令来显示最后几行
在linux命令行下,可以直接使用tail -n 10 access.log很轻易的显示日志文件最后几行,可以直接用php来调用tail命令,执行php教程代码如下.
整个代码执行完成耗时 0.0034 (s)
代码如下 |
复制代码 |
file = 'access.log';
$file = escapeshellarg($file); // 对命令行参数进行安全转义
$line = `tail -n 1 $file`;
echo $line;
|
3. 直接使用php的fseek来进行文件操作
这种方式是最为普遍的方式,它不需要将文件的内容全部读入内存,而是直接通过指针来操作,所以效率是相当高效的.在使用fseek来对文件进行操作时,也有多种不同的方法,效率可能也是略有差别的,下面是常用的两种方法.
方法一:
首先通过fseek找到文件的最后一位EOF,然后找最后一行的起始位置,取这一行的数据,再找次一行的起始位置,再取这一行的位置,依次类推,直到找到了$num行。
实现代码如下
整个代码执行完成耗时 0.0095 (s)
代码如下 |
复制代码 |
function tail($fp,$n,$base=5)
{
assert($n>0);
$pos = $n+1;
$lines = array();
while(count($lines)< =$n){
try{
fseek($fp,-$pos,SEEK_END);
} catch (Exception $e){
fseek(0);
break;
}
$pos *= $base;
while(!feof($fp)){
array_unshift($lines,fgets($fp));
}
}
return array_slice($lines,0,$n);
}
var_dump(tail(fopen("access.log","r+"),10));
|
方法二 :
还是采用fseek的方式从文件最后开始读,但这时不是一位一位的读,而是一块一块的读,每读一块数据时,就将读取后的数据放在一个buf里,然后通过换行符(n)的个数来判断是否已经读完最后$num行数据.
实现代码如下
整个代码执行完成耗时 0.0009(s).
代码如下 |
复制代码 |
$fp = fopen($file, "r");
$line = 10;
$pos = -2;
$t = " ";
$data = "";
while ($line > 0) {
while ($t != "n") {
fseek($fp, $pos, SEEK_END);
$t = fgetc($fp);
$pos --;
}
$t = " ";
$data .= fgets($fp);
$line --;
}
fclose ($fp);
echo $data |
方法三:
整个代码执行完成耗时 0.0003(s)
代码如下 |
复制代码 |
$fp = fopen($file, "r");
$num = 10;
$chunk = 4096;
$fs = sprintf("%u", filesize($file));
$max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : filesize($file);
for ($len = 0; $len < $max; $len += $chunk) {
$seekSize = ($max - $len > $chunk) ? $chunk : $max - $len;
fseek($fp, ($len + $seekSize) * -1, SEEK_END);
$readData = fread($fp, $seekSize) . $readData;
if (substr_count($readData, "n") >= $num + 1) {
preg_match("!(.*?n){".($num)."}$!", $readData, $match);
$data = $match[0];
break;
}
}
fclose($fp);
echo $data;
|
给客户做二维码防伪,他需要把二维码贴到产品上,然后下载二维码不能跟产品一一对应。
所以就有了这个功能要求。
将二维码与产品的id合并成一张图。。。
我的步骤是先把生成一张图,把产品的id放进去。。。然后再把二维码的图片与生成的图片合并。。。
说合并其实就是把二维码贴到生成的图上面。。。
具体代码如下
代码如下 |
复制代码 |
$width=310; //布画宽度
$height=360; //布画高度
$im = imagecreate($width,$height);
$img2=imagecreatefrompng("$url");//获得二维码
$im_WH=getimagesize("$url");//取得二维码图片的属性
$im_W=$im_WH[0];
$im_H=$im_WH[1];
$white = ImageColorAllocate($im, 255,255,255);//定义白色 背景色
$black = ImageColorAllocate($im, 0,0,0);//定义黑色 字体颜色
$rectangelcolor=ImageColorAllocate($im,150,150,150);//定义边框颜色
imagerectangle($im,1,1,$width-1,$height-1,$rectangelcolor);//画边框
imagettftext($im,22,0,15,330,$black,'C:WINDOWSFontsarial.ttf',"$proid");//写入产品id
imagecopy($im,$img2,5,5,0,0,$im_W,$im_H);//合并两张图
$images = mrand4B().time(). '.jpg';//图片新命名
$path = $_SERVER['DOCUMENT_ROOT'].'/static/downloadpic/'.$images;//图片路径
imagejpeg($im,$path);//生成新图放到指定的路径中
imagedestroy($im);//释放内存
return $images;//返回图片名,以便存入数据库
|
注意phpgd库默认是未开启了,我们如果没能使用gd库就需要开启,具体方法
我们需要在php.ini中把extension=php_gd2.dll 去掉前面的;就行了就行了。
在php中我们在linux服务器安装了邮件组件可以直接使用mail函数发送邮箱,对于windows系统我们多半使用PHPMailer实现邮件发送了,下面来看一个简单的例子。
使用PHPMailer类实现邮件的发送。
代码如下 |
复制代码 |
$phpmailer = new PHPMailer();
$phpmailer->IsSMTP(); // 用smtp协议来发
$phpmailer->Host = 'smtp.163.com';
$phpmailer->SMTPAuth = true;
$phpmailer->Username = '******'; //163邮箱帐号 @163前面的那个
$phpmailer->Password = '******'; //密码
// 可以发信了
$phpmailer->From = '*****@163.com'; //邮箱地址
$phpmailer->FromName = 'yanjiadong';
$phpmailer->Subject = '欢迎你注册,你的激活邮件';
$phpmailer->Body = '请点击进行激活';
// 添加收件人
$phpmailer->AddAddress('********@qq.com','用户名');
// 发信
echo $phpmailer->send()?'ok':'fail';
|
注意phpmailer组件下载可以百度搜索一下。
标签:[!--infotagslink--]