yii2 循环执行sql导致内存耗尽的问题解决

Continue Read..

yii2循环执行sql的时候

for ($i = 0; $i < $iterations; $i ++) {
    ...
    Yii::$app->db->createCommand()
        ->batchInsert(static::tableName(), $columns, $rows)
        ->execute();
    echo memory_get_usage();
}

会出现500错误,看下php错误日志,大概会看到内存耗尽的提示

[06-Apr-2017 15:55:43 PRC] PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 2077602 bytes) in E:\wamp\www\xxx\vendor\yiisoft\yii2-debug\LogTarget.php on line 57

 

这个是由于yii2的日志模块引起的,具体的大家看看代码,不多说了

解决方案

1、在处理循环sql的时候,替换掉自带的日志模块

2、关掉日志模块

 

具体的看这里

I think that problem is in logger of Yii2. Just try to use something like that:

common/components/EmptyLogger.php:

<?php
namespace common\components;

use yii\log\Logger;

class EmptyLogger extends Logger
{
    public function log($message, $level, $category = 'application')
    {
        return false;
    }
}

and then in your action of your controller include next code at the beginning:

Yii::setLogger(new EmptyLogger());

of course also add it in your uses:

use common\components\EmptyLogger;

after all you will receive something like that:

console\controllers\TempController.php:

<?php

namespace console\controllers;

use common\components\EmptyLogger;
use Yii;
use yii\console\Controller;

class TempController extends Controller
{
    public function actionIndex()
    {
        Yii::setLogger(new EmptyLogger());
        ...

        Yii::$app->db->createCommand()
            ->batchInsert(static::tableName(), $columns, $rows)
            ->execute();
        ...

    }
}

Hope it helps. But actually it's not the best solution. Just a hack..

参考:http://stackoverflow.com/questions/27420959/yii2-batchinsert-eats-all-server-memory

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【Yii2】behaviors 控制器访问前和访问后的操作

Continue Read..
最近要做个控制机访问的日志功能,而且还要记录访问的返回值,又不想在每个控制器里面加代码,这时就用了   

新建一个php文件

<?php
namespace common\models;
use Yii;
use yii\base\ActionFilter;
use cpbackend\controllers\AgencyController;
class TestFilter extends ActionFilter {
    //在action之前运行,可用来过滤输入
    public function beforeAction($action) {
        return TRUE;//如果返回值为false,则action不会运行
    }
    //在action之后运行,可用来过滤输出
    public function afterAction($action, $result) {
        //获取控制器的对象属性
        $logArr['xx'] = empty($action->controller->_user['adminInfo']) ? 0 : $action->controller->_user['adminInfo']['xx'];
        //获取访问的控制器名称 比如  a/b
        $logArr['requste'] = json_encode(Yii::$app->requestedRoute);
        //获取请求的参数
        if(!empty($action->controller->actionParams)){
            $logArr['data'] = json_encode($action->controller->actionParams);
        }
        if(!empty(Yii::$app->getRequest()->getRawBody())){
            $logArr['data'] = Yii::$app->getRequest()->getRawBody();
        }
        //获取请求类型
        $logArr['type'] = "";
        if(yii::$app->request->isGet){
            $logArr['type'] = "GET";
        }
        if(yii::$app->request->isPost){
            $logArr['type'] = "POST";
        }
        //这里获取返回的值  
        if(!$this->is_json($result)){
            $result = json_encode($result);
        }
        $logArr['return'] = $result;
        AgencyController::createlog($logArr);
        return $result; 
    }
    function is_json($string) { 
        return (json_last_error() == JSON_ERROR_NONE);
    }
}



然后各个控制器里面加上
 public function behaviors()
    {
        return [
            'access' => [
                'class' => 'common\models\TestFilter',
                // 'only' => ['index'],   //这里是能访问的控制器
                // 'except' => ['getlist'],   //这里是不能访问的控制
            ],
        ];
    }


特别要注意 每个控制器比如是return xxx;结尾 并且不能die掉
感谢老外童鞋的帮助~~~~

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【YII2】手机归属地

Continue Read..

将插件放在 根目录下面  vendor

然后修改   /vendor/composerautoload_psr4.php  

加一列  'Easthing\\' => array($vendorDir . '/phonelocation-master/src'),

 

    /**

     * 获取手机 归属地   $My_fun->getTelArea("1361729xxxx");

     * @param unknown $tel

     */

    function getTelArea($tel){

        if(empty($tel)){

            return "";

        }

        $row = \Easthing\PhoneLocation::find($tel);

        return $row;

    }

 

参考地址  https://github.com/easthing/phonelocation

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【Yii2 高级版】 使用中记录

Continue Read..

持续记录~~~

1.跳转

yii2 单web         echo $this->redirect ( "/login/logout" ); die;

yii2 高级            return   Yii::$app->getResponse()->redirect("/login/logout");

 

1.根地址

yii2 高级           Yii::$app->getHomeUrl()

 

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【YII2】跨Controller调用action

Continue Read..

比如我有A,B2个Controller  同时又actionIndex方法  我想用A调用B的方法 

$xx = new BController('b', $this->module);

$xx ->actionIndex();die;

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

yii2不使用自带redis

Continue Read..

yii2自带redis不需要安装php扩展,参数偏向cli方式,不太方便,

不习惯的朋友可以自己写个组件,使用扩展形式的,代码如下

没有写权限设置,需要的自己填加,不要将redis端口暴露在公网

<?php
/**
 * 此文件放入components目录
 * 配置文件加入
 * 'redis'=>[
 *			'class'=>'app\components\redisClient',
 *			'hostname'=>'127.0.0.1',
 *			'port'=>6379,
 *			'database'=>1,
 *		],
 *	
 * 使用:	
 * $redis = yii::$app->redis->getInstance();
 * $redis is object 
 * @author admin
 *
 */
namespace app\components;

use Yii;
use yii\base\Component;
class redisClient  extends Component {
	public $hostname = '';
	public $port = '';
	public $database = '';
	public $_client = '';
	
	function init(){
		$this->_client = new \Redis;
		$this->_client->connect($this->hostname, (int)$this->port);
		if (isset($this->password)) {
			if ($this->_client->auth($this->password) === false) {
				throw new \Exception('Redis authentication failed!');
			}
		}
        $this->_client->select((int)$this->database);
        return $this->_client;
	}
	
	function getInstance(){
		if(!empty($this->_client)){
			return $this->_client;
		}
		return false;
	}
}

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【YII2】配置多数据库和主从数据库

Continue Read..

在web.php里面配置主从数据库

 

        'db_c2b' => [

            'class' => 'yii\db\Connection',

            'dsn' => 'mysql:host=xxxxx;dbname=xxxxx',

            'username' => 'xxxx',

            'password' => 'xxxx',

            'charset' => 'utf8',

            // 从服务器的通用配置

            'slaveConfig' => [

                'username' => 'xxxxx',

                'password' => 'xxxxx',

                'charset' => 'utf8',

            ],

            // 从服务器配置列表

            'slaves' => [

                ['dsn' => 'mysql:host= ;dbname=c2b']

            ],

        ],

 

 

配置多个数据库 调用的时候需要在model层重写

public static function getDb() {

return \Yii::$app->db_c2b;  

}

 

 

比如你这里配置2个数据库 一个普通 一个主从 

如果你在主从里面不重写的话  会调用 普通的库 

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

yii2-admin权限管理使用说明

Continue Read..

yii2-admin是基于yii2的rbac写的管理模块,安装请见https://github.com/mdmsoft/yii2-admin

安装好后访问http://url/admin

Grand Access      对用户授权,用户自己在user表添加

Roles                 角色管理,设置角色的权限

Permissions        权限管理,设置某一权限可访问的router

Routes               可访问的router管理

Rules                 规则类设置

Menus                目录设置

 

在授权时,可以为用户赋予角色,当某一用户需要在某一角色上加一些权限时,可配合赋予Permissions。

 

rules

即自定义规则,在设置Roles和Permissions时可设置自定义的规则

你需要先在components目录实现一个自定义rule,代码类似下面

<?php
namespace app\components;

use yii\rbac\Rule;

/**
 * Checks if authorID matches user passed via params
 */
class TestRule extends Rule
{
	public $name = 'isAuthor';

	/**
	 * @param string|integer $user the user ID.
	 * @param Item $item the role or permission that this rule is associated with
	 * @param array $params parameters passed to ManagerInterface::checkAccess().
	 * @return boolean a value indicating whether the rule permits the role or permission it is associated with.
	 */
	public function execute($user, $item, $params)
	{	var_dump($user, $item, $params);exit;
		return isset($params['post']) ? $params['post']->createdBy == $user : false;
	}
}

设置rulename和class name,

name:testrule

class name:app\components\TestRule

提交即可设置一个自定义规则,后面在设置roles和permissions的时候就可以填写规则名来使用了,

在设置roles和permissions时可以看到data框,这里可以填json数据,供rule类初始化。


Menus

目录,用于根据用户权限显示目录,所见即可操作

name          router显示名称,如“测试方法A”

parent name 父router,输入控制器前几个字母会自动提示

route           router,如“/test/a”

order           排序,数字,小的靠前

data             附加的json数据,getAssignedMenu的callback中使用

MenuHelper::getAssignedMenu((int)Yii::$app->user->id,null,null,true)返回层级array,

第四个参数是否刷新,true为强制刷新,不使用缓存

 

如何判断权限

在控制器中加入如下代码

public function beforeAction($action){
		$session = Yii::$app->session;
		if (!$session->isActive){
			$session->open();
		}
		if(empty($session['userName'])){
			$this->redirect('/login');
			return true;
		}
		$CA = '/'.yii::$app->controller->id.'/'.$action->id;
		if(!\Yii::$app->user->can($CA)){
			die($session['userName']." 没有权限访问 ".$CA);
		}
		return true;
	}
die可以改为错误提示页面

rbac权限原理比较简单,不懂的可以子看下源代码,或看下yii2的rbac文档http://www.yiiframework.com/doc-2.0/guide-security-authorization.html

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【YII2】自带组件发邮件

Continue Read..

首先在web.php components 里面修改mailer

 

     'mailer' => [

    'class' => 'yii\swiftmailer\Mailer',

    'useFileTransport' =>false,//这句一定有,false发送邮件,true只是生成邮件在runtime文件夹下,不发邮件

    'transport' => [

    'class' => 'Swift_SmtpTransport',

    'host' => 'smtp.163.com',

    'username' => '你的邮箱',

    'password' => '你的密码',

    'port' => '25',

//     'encryption' => 'tls',

    ],

    'messageConfig'=>[

    'charset'=>'UTF-8',

    'from'=>['你的邮箱=>'邮箱名称']

],

],


然后调用邮箱组件

$mail = Yii :: $app -> mailer -> compose ( );

$mail -> setTo (['邮箱','邮箱']);

$mail -> setSubject ( '标题');

// $mail->setTextBody('zheshisha '); //发布纯文字文本

$mail -> setHtmlBody ( '内容'); // 发布可以带html标签的文本

$mail -> send ( );

 

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【PHP】Paypal支付和IPN(YII2版)

Continue Read..

首先去paypal沙盒申请一个账号 并且申请一个虚拟商家账号和一个买家账号

沙盒地址  https://developer.paypal.com/developer/applications/

点击查看原图点击查看原图




然后设置 IPN  

 

登陆  https://www.sandbox.paypal.com/  用商家账号

 

点击查看原图点击查看原图

 

设置你 IPN的回调地址 比如  https://xxx.com/ipn

IPN代码参考 https://github.com/paypal/ipn-code-samples/blob/master/paypal_ipn.php

 

 

支付实现 参考代码网址  https://github.com/paypal/PayPal-PHP-SDK/wiki/Installation

官网示例代码     https://github.com/paypal/rest-api-sample-app-php

 

下载YII2  然后 composer 安装 paypal  具体的百度 我也会把全部代码上传附件  

附件 有3个 脚本是直接配置可以运行的(官方代码)   YII2是我写的    另一个是数据库 

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权