背景:如Gitlab的那个备份日志就是以Unix的时间戳表示的,怎么能看到底是啥时候呢?当然用 stat 也能看,这儿主要是学习一下互相转化。

几小时几分:


echo `date "+%F %T" `
2018-04-03 11:56:12


A.将日期转换为Unix时间戳


将当前时间以Unix时间戳表示:
date +%s
输出如下:
1361542433


转换指定日期为Unix时间戳:
date -d '2013-2-22 22:14' +%s
输出如下:
1361542440


B.将Unix时间戳转换为日期时间


不指定日期时间的格式:
date -d @1361542596
输出如下:
Fri Feb 22 22:16:36 CST 2013


指定日期格式的转换:
date -d @1361542596 +"%Y-%m-%d %H:%M:%S"
输出如下:
2013-02-22 22:16:36

来自:http://blog.csdn.net/clevercode/article/details/49993237
基本上有两个方法,一个是comm命令,一个是grep命令。分别介绍如下:
comm命令 , Compare sorted files FILE1 and FILE2 line by line. With  no options, produce three-column output.  Column one contains lines unique to FILE1, column two contains lines unique to FILE2, and column three contains lines common to both files. 要注意两个文件必须是排序和唯一(sorted and unique)的,默认输出为三列,第一列为是A-B,第二列B-A,第三列为A交B。这个哥们写得好,尽管我不懂linux文件流的用法,但是大致看出来了,我用了三个步骤,而用一行就搞定了,简单可用:http://m.blog.csdn.net/article/details?id=6579320


文件行数少最直观快捷的diff办法:
vimdiff <(sort a.txt|uniq) <(sort b.txt|uniq)

/proc/15750/fd/63 [只读]      /proc/15750/fd/62 [只读]
——————————————————————————————
一般求差集的多一些:
求差
comm a.txt b.txt  -3 | sed 's/^\t//'
差集
comm a.txt b.txt  -2 -3

实践如下:

sort getosok.txt >> getosoksort.txt
sort r11.txt >> r11sort.txt
comm r11sort.txt getosoksort.txt   -2 -3



再次实践,注意这两个文件都要去重,否则不太好比较,-2 -3显示左边文件有的右边没有的:
sort mysqlsort.txt|uniq   //sort结合uniq命令去重复行找出重复次数大于1的行参考:http://justwinit.cn/post/3671/

sort 主机层面能ssh连接的.txt |uniq >> 主机层面能ssh连接的排序过的去过重的.txt
sort 数据库应用开发现在的.txt |uniq >> 数据库 应用开发现在的排序过的去过重的.txt



comm  数据库应用开发现在的排序过的去过重的.txt 主机层能ssh连接的排序过的去过重的.txt   -2 -3
10.71.11.4*  //这个是列出左边有,右边文件没有的内容,也就是 “数据库应用开发现在的排序过的且去重的.txt”里有,而右边这个“主机层面能ssh连接的排序过的.txt” 没有。

comm 主机层面能ssh连接的排序过的去过重的.txt 数据库应用开发现在的排序过的 去过重的.txt -2 -3
10.70.*.42
10.70.*.53
10.70.*.1
10.70.*.2
10.71.*.29

注意:
1. comm命令要求输入文件的内容必须是排序且唯一的
2. comm -12 表示取消第一列和第二列的输出,即只输出第三列。[/warning]

主机层面能ssh连接的排序过的有,而右边没有。
http://www.ttlsa.com/linux/linux-file-comparison-operations-text-file-of-the-intersection-difference-sets-and-difference/
今天和兄弟在2017北京PHP全球开发者大会-高可用的PHP探讨了一下,mysqli::reap_async_query、curl_multi_exec两个函数,这两个函数在实现上是否真的可用于高并发?场景是啥? 1)这两个函数没法一块使用,形成类似协程的效果,有局限性。 2)这个数据库这块儿的并土用来做导入数据或导出的一些后台操作,并不在前端使用。

有个兄弟,用Swoole的Task做一些后台并行操作这样的事情,用Task的Retrun,然后,用Swoole的Finish汇总,把一些返回的状态位放到SwooleTable里或全局变量里,相关小巧。
PHP实现MySQL并发查询:http://www.cnblogs.com/shaoguan/p/6515072.html
cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)

版本:php-5.6.20
configure: error: Cannot find ldap libraries in /usr/lib 解决办法:
今天在centos 6.2 64位版本上安装LNMP,config php的时候出现下面错误而退出

CentOS 64 编译PHP出现 error: Cannot find ldap libraries in /usr/lib 有需要的朋友可参考参考。
在CentOS 64位下编译安装PHP5.4.8。cp -frp /usr/lib64/libpng* /usr/lib/ 结果在configure的时候提示
configure: error: Cannot find ldap libraries in /usr/lib
提示在/usr/lib 下找不到相关模块,这是因为64位的linux默认把以上文件都存在 /usr/lib64 文件夹下。
解决方法:
代码如下
cp -frp /usr/lib64/libldap* /usr/lib/


From:http://www.iitshare.com/cannot-find-ldap-libraries-in-usrlib.html
-----------------------------------这种问题到处都有---------------------------------------
configure: error: Cannot find ldap libraries in /usr/lib
提示在/usr/lib 下找不到相关模块,这是因为64位的linux默认把以上文件都存在 /usr/lib64 文件夹下。
解决办法:
cp -frp /usr/lib64/libldap* /usr/lib/


然后再./configure ...即可

From:http://www.cnblogs.com/xiangxiaodong/p/3492156.html

打包时先拷贝,再./configure:

%build
/bin/cp -frp /usr/lib64/libldap* /usr/lib/
./configure \
--prefix=%{_prefix} \
--with-libdir=%{_lib} \
--with-config-file-path=/usr/local/php/etc \
--with-config-file-scan-dir=/usr/local/php/etc/php.d \
--with-iconv-dir=/usr/local \
--with-iconv=/usr/local/libiconv \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-ldap \
--with-ldap-sasl \
--with-libxml-dir=/usr \
--with-curl \
--with-curlwrappers \
--with-mcrypt \
--with-gd \
--with-openssl \
--with-mhash \
--with-xmlrpc \
--without-pear \
--with-fpm-user=www \
--with-fpm-group=www \
--with-gettext \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--enable-xml \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-fpm \
--enable-mbstring \
--enable-gd-native-ttf \
--enable-pcntl \
--enable-sockets \
--enable-zip \
--enable-soap \
--enable-opcache \
--enable-exif \
--enable-mbregex \
--enable-inline-optimization \
--enable-ftp \
--disable-fileinfo \
--disable-rpath \
--disable-ipv6 \
--disable-debug
make ZEND_EXTRA_LIBS='-liconv' %{?_smp_mflags}

%install
rm -rf %{buildroot}
make INSTALL_ROOT=%{buildroot} install

save_cycle_data || { echo 'save cycle data failed' && exit 1; }  #调用函数失败的写法
basedir=$(cd "$(dirname "$0")";pwd)
echo $basedir

cat /backup/3306/cycle_file
BASE_ID=base-2018-06-11-1203
INCREMENTAL_STEP=20534973839
LAST_LSN=2
获取到等号后面的位置:


获取INNODB的Last checkpoint at:


参数之f3,砍断后第三节,如下:

$git branch -a|grep -v "*" | grep -v ">"
  master
  remotes/origin/dev
  remotes/origin/master


Cut上来:

$git branch -a|grep -v "*" | grep -v ">"|cut -d "/" -f3
  master
dev
master



sed 去空格和Tab:

git branch -a|grep -v "*" | grep -v ">"|cut -d "/" -f3|sed "s/^[ \t]*//g"



去掉重复行:

$git branch -a|grep -v "*" | grep -v ">"|cut -d "/" -f3|sed "s/^[ \t]*//g"
master
dev
master



按正顺序sort:(反着排序 -r)

$git branch -a|grep -v "*" | grep -v ">"|cut -d "/" -f3|sed "s/^[ \t]*//g"|sort
dev
master
master



uniq上来去重:

git branch -a|grep -v "*" | grep -v ">"|cut -d "/" -f3|sed "s/^[ \t]*//g"|sort|uniq



防止太多,限制10条,head -10上来:

git branch -a|grep -v "*" | grep -v ">"|cut -d "/" -f3|sed "s/^[ \t]*//g"|sort|uniq|head -10




当然,还有更简单的,不用git branch -a:
主要是了解命令:

$git branch |sed "s# ##g"|sed "s#*##"
dev
master

addr:You have new mail in /var/spool/mail/root


检查是否安装了libxm包

[root@rh-Linux software]# rpm -qa |grep libxml2
libxml2-2.7.6-21.el6_8.1.x86_64
libxml2-devel-2.7.6-21.el6_8.1.x86_64
libxml2-python-2.7.6-21.el6_8.1.x86_64
重新安装libxml2和libxml2-devel包, yum安装的时候发现新版本会提示更新,需要更新的可以更新,不要跳过就行了。

[root@rh-linux /]# yum install libxml2
[root@rh-linux /]# yum install libxml2-devel -y
安装完之后查找xml2-config文件是否存在

[root@rh-linux /] #find / -name "xml2-config"
/usr/bin/xml2-config

From:http://blog.csdn.net/risingsun001/article/details/43705273
php安装模块见http://fffo.blog.163.com/blog/static/211913068201401464238334/

1、官网下载
wget http://prdownloads.sourceforge.net/lam/ldap-account-manager-4.3.tar.bz2?download
2、解压
tar -xjf  ldap-account-manager-4.3.tar.bz2
3、直接移动到apache 根目录
mv  ldap-account-manager-4.3 /usr/local/apache/htdocs/lam
4、给它可以访问的权限
chmod 777 -R /usr/local/apache/htdocs/lam
5、进入配置目录
cd /usr/local/apache/htdocs/lam/config
6、创建主参数文件
cp config.cfg_sample config.cfg
7、创建连接ldap服务器参数文件
cp lam.conf_sample lam.conf
vim lam.conf
修改 所有的dc=1v,dc=cn
8、web访问
http://203.195.187.200/lam/templates/login.php

上面的模式是只限管理员登录模式。现在切换到用户登录模式
点击LAM配置——>编辑服务器配置文件——>默认密码是lam(可修改)——>通用设置——>安全设定

From:http://blog.csdn.net/u012461550/article/details/42608781

我的是在:
/usr/local/lam/etc/unix.conf
一、旧版本的PHP(php5.3.27)要装Mysql之后才能装Mysql(mysqli)扩展?编译选项有这个:
--with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config

传统的安装php的方式中,我们在编译PHP时,一般需要指定以下几项:
--with-mysql=/usr/local/mysql
--with-pdo-mysql=/usr/local/mysql
这实际上就是使用了mysql官方自带的libmysql驱动, 这是比较老的驱动, PHP 5.3开始已经不建议使用它了, 而建议使用mysqlnd.


以上是摘录,更多查看:http://blog.163.com/yxba_02/blog/static/187557620160401018458/


二、PHP7啥的都不用指定Mysql的位置,直接就能编译通过的呀~

PHP7这样的:
--with-mysql=mysqlnd \    
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \

现在系统存在历史问题,没法一时半会升级PHP7了,还在用 php5.3.27上混,编译选项有指定Mysql路径的。
ldd php
发现:
libmysqlclient.so.18 => /usr/lib64/libmysqlclient.so.18 (0x00002b5b5dec7000)
也就是说PHP5.3.7最后还是编译成自己的LIb了,没有Mysql一样能跑,这TM是个问题,装个PHP还得装上Mysql,这个低版本的PHP还得装Mysql服务才行哟。

总之,Mysql和PHP在低版本有了较强的捆绑,而新的PHP7采用Mysqlnd(MySQL Native Driver),摆脱了这一依赖,更简单,更高效。php高版本不再使用mysql_connect()来连接数据库。

背景:听说Lumen起家是以一个叫av的框架,larvael。以Auth2.0起步,Lumen是精简版本,于是想了解一下。发现居然边TM路由就卡住了,Fuck,不光是我老外也有这个问题,都没有解决,主要是一个Nginx的转写问题,这块在Lumen的文档里写的很垃圾,我都不知这些人是怎么写文档的,有用Apache,有Nginx的就不能写细一点么,说一下原理啥的,关键是Nginx配置文件里面的:location /里面的重写。
From:http://blog.csdn.net/wowkk/article/details/52104689

Lumen 5.5.*版本的Lumen,目录:lumen-clear-edition
composer create-project laravel/lumen lumen-clear-edition --prefer-dist  "5.5.*"  # proc_open,

vi ms/survey/bootstrap/app.php
require __DIR__.'/../config/providers.php'

vi ms/survey/config/providers.php
<?php
$app->register(Common\Providers\RedisServiceProvider::class);
$app->register(Common\Providers\MysqlServiceProvider::class);
$app->register(Common\Providers\KafkaServiceProvider::class);
$app->register(Common\Providers\EventServiceProvider::class);
$app->register(Common\Providers\QueueServiceProvider::class);

注册的文件在:
ls ./lumen-clear-edition/common/Providers
EventServiceProvider.php  MysqlServiceProvider.php  RedisServiceProvider.php

启动方法:
启动方法#服务提供者中注册一个视图 composer 则应该在 boot 方法中完成。此方法会在所有其它的服务提供者被注册后才被调用,意味着你能访问已经被框架注册的所有其它服务:https://lumen.laravel-china.org/docs/5.3/providers,ServiceProvider类,和绑定easy_kafka类:
lumen-clear-edition/common/Providers/KafkaServiceProvider.php

vi lumen-clear-edition/common/Service/Kafka/Kafka.php   #自己写这个类的方法。


绑定的easy_kafka在这儿:
lumen-clear-edition/common/Facades/Kafka.php


ms/survey/app/Http/Controllers/Api/V1/ActivityController.php  #路由@./ms/survey/routes/web.php
$router->group(['namespace'=>'Api\V1'], function () use ($router) {
    $router->post('activity/form', ['uses' => 'ActivityController@form']);


ms/survey/app/Helpers/Client/SurveyClient.php  


类的加载,common文件夹位置:
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Common\\": "common/"
        }
    },
#composer dump-autoload --optimize
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Generating optimized autoload files

生成文件在这儿(挪动一下文件放到新目录,建议重新运行一下这个:composer dump-autoload --optimize,再就是如果有PHP的OPcache得重新启动一下PHP-FPM或关闭掉Opcache,/usr/local/php/etc/php.d/opcache.ini ,opcache.enable=0):
./lumen-clear-edition/vendor/composer/autoload_psr4.php:    'Common\\' => array($baseDir . '/common'),
More:


#find ./ -mtime 0 -type f
./composer.json   <== "Common\\": "common/"
./app/Http/Controllers/Api/V1/ActivityController.php
./app/Helpers/Client/SurveyClient.php
./common/Providers/UserServiceProvider.php
./common/Facades/User.php
./common/Services/User/User.php
./config/providers.php


composer dump-autoload --optimize改动的:
./vendor/autoload.php  ==》return ComposerAutoloaderInit7d1969d6b0c0a5e119f2b7e0932178e2::getLoader();
./vendor/composer/autoload_psr4.php
./vendor/composer/autoload_static.php
./vendor/composer/autoload_classmap.php
./vendor/composer/autoload_files.php
./vendor/composer/ClassLoader.php
./vendor/composer/autoload_namespaces.php
./vendor/composer/autoload_real.php

访问URL: http://47.93.207.136/activity/survey
最后,这个Provider的类如何使用参考,但写得不是很明白,最新版本的和实际使用并不定一模一样的:http://www.cnblogs.com/cxscode/p/7569856.html



路由:https://lumen.laravel.com/docs/5.4
中文文档:http://laravelacademy.org/laravel-docs-5_4
5.4这个路由,老外写得很简单,这帮人可能是想你去看他的代码吧,有很多人在问:
http://www.thinksaas.cn/ask/question/22000/
class KafkaServiceProvider extends ServiceProvider{
return new \Common\Service\Kafka\Kafka(); #lumen-clear-edition/common/Service/Kafka/Kafka.php
lumen-clear-edition/common/Service/Kafka/Kafka.php 里:




做微服务:/usr/local/nginx/conf/vhosts/ms.conf

server_name  10.70.**.142;
root /data/www/ms/;
rewrite ^/(survey)/.*$ /$1/public/index.php last;
http://10.70.33.140/survey/public/index.php
/data/www/ms/survey/public/index.php
路由:
/data/www/ms/survey/routes/web.php

一)$app->group(['prefix' => 'private','namespace'=>'Api\V1'], function () use ($app) {
    $app->get('survey/list', ['uses' => 'SurveyController@list']);
http://47.93.207.136/private/survey/list
app/Http/Controllers/Api/V1/SurveyController.php

二)$app->group(['namespace'=>'Api\V1'], function () use ($app) {
    $app->get('activity/survey', ['uses' => 'ActivityController@survey']);
http://47.93.207.136/activity/survey
app/Http/Controllers/Api/V1/ActivityController.php 里有一行:
$client = new SurveyClient();
./app/Helpers/Client/SurveyClient.php:class SurveyClient{

Lumen (5.5.2) (Laravel Components 5.5.*),路由的写法有点不一样:
$router->group(['prefix' => 'private','namespace'=>'Api\V1'], function () use ($router) {
        $router->get('survey/list', ['uses' => 'SurveyController@list']);

$router->group(['namespace'=>'Api\V1'], function () use ($router) {
        $router->get('activity/survey', ['uses' => 'ActivityController@survey']);


调用层级及配置文件的一个情况,二是如何引入框架目录的入口:
./app/Http/Controllers/Api/V1/SurveyController.php:class SurveyController extends Controller{
/**
* 删除互动
*/
public function delete(Request $request){
  $iid = intval($request->input('iid'));
  $res = Survey::deleteSurvey($iid);#调用Models
  return $this->out($res?1:0,$res?"success":"failed");
}

调用Models位置:
./app/Models/Survey.php:        public static function deleteSurvey($iid){

配置文件:
/data/www/ms/survey/config_production/database.php
/data/www/ms/survey/config_production/kafka.php
/data/www/ms/survey/config_production/redis.php

vi /data/htdocs/lumen.levoo.com/bootstrap/app.php   #引入框架目录



======================================================================================
Lumen 中可以使用的 Facades,查看源代码,可用清单如下(https://segmentfault.com/a/1190000002902055):
/survey/bootstrap/app.php:$app->withFacades();  $app->withFacades();
./lumen-clear-edition/vendor/laravel/lumen-framework/src/Application.php:    public function withFacades($aliases = true, $userAliases = [])
./vendor/laravel/lumen-framework/src/Application.php
public function withAliases($userAliases = [])
if (! static::$aliasesRegistered) {
  static::$aliasesRegistered = true;

  $merged = array_merge($defaults, $userAliases);

  foreach ($merged as $original => $alias) {
    class_alias($original, $alias);
  }
}


==========================================================================================
/usr/local/composer/composer.phar  global require "laravel/lumen-installer"
https://lumen.laravel.com/docs/5.4#server-requirements 下面的:
chmod a+x /root/.config/composer/vendor/laravel/lumen-installer/lumen
/root/.config/composer/vendor/bin/lumen new lumen.levoo.com

/data/htdocs/lumen.levoo.com/blog/routes/web.php

你可以将所有路由都定义在routes/web.php中。最基本的 Lumen 路由接收:
http://laravelacademy.org/post/6337.html



$app->group(['prefix'=>'test'],function($app){
    $app->get("/index",["uses" => "TestController@index"]);
                                                                                                                                                                                                              
});


【lumen】基础点记录使用:blog.csdn.net/imdingding/article/details/48679359
app/Http/routes.php中进行路由配置可以使用如下路由组的形式,在路由上lumen和laravel有一些区别
$app->group(['prefix' => 'scrollnews','namespace' => 'App\Http\Controllers'],function($app) {
$app->get('/','NewsController@showall');
$app->get('/{time}_{newpage}.htm','NewsController@showtime');
$app->get('/{newpage}.htm', 'NewsController@show');

});


http://123.57.252.183/test/index
hello Lumen (5.4.5) (Laravel Components 5.4.*)
/data/htdocs/lumen.levoo.com/app/Http/Controllers/TestController.php

<?php

namespace App\Http\Controllers;

use App\user;   //新增部分
use Laravel\Lumen\Routing\Controller as BaseController;
use Illuminate\Http\Request;

class TestController extends BaseController
{
    //直接传人sql方式操作数据库
    function index(Request $request){
        echo "hello Lumen (5.4.5) (Laravel Components 5.4.*)。";die;                                                                                                                                          
        return User::all();
    }
}


以上实践来源及变通参看了:http://blog.5ibc.net/p/87952.html

PHP message: PHP Fatal error:  Uncaught UnexpectedValueException: The stream or file "/data/htdocs/lumen.levoo.com/storage/logs/lumen.log" could not be opened: failed to open stream: Permission denied in /data/htdocs/lumen.levoo.com/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php:107
mkdir
chmod -R 755 /data/htdocs/lumen.levoo.com/storage
chown -R www /data/htdocs/lumen.levoo.com/storage


Controller类的写法:https://segmentfault.com/q/1010000002727820
/data/htdocs/lumen.levoo.com/blog/app/Http/Controllers/AccountController.php



关于数据库配置文件:
默认情况下, Lumen 使用单一的 .env 文件来配置你的应用, 然而, 你也可以使用 Laravel 风格 的配置方法.
/data/htdocs/lumen.levoo.com/vendor/laravel/lumen-framework/config/database.php
文件夹下对应的配置文件复制到根目录下的 config 文件里面就行.
https://lumen.laravel-china.org/docs/5.3/configuration#configuration-files

Redis:
CACHE_DRIVER=file
SESSION_DRIVER=redis
QUEUE_DRIVER=sync

REDIS_HOST=192.168.1.248
REDIS_PASSWORD=null
REDIS_PORT=6379



今天在部署服务器的时候,使用composer来安装依赖。遇到了如下情况,这块出错好像和Redis配置有关,得在.env里配置好并运行起来。
  The Process class relies on proc_open, which is not available on your PHP installation.
  [ErrorException]                                          
  proc_get_status() has been disabled for security reasons
  开始的时候,我有些不知所措,于是冷静下来思考一番,然后goolge了一下
解决方法:
  在php.ini中,找到disable_functions选项,看看后面是否有proc_open函数被禁用了,如果有的话,去掉即可
  其实如果php的文档熟悉的话,你应该马上就能知道proc_open实际上是一个函数,是php用来和shell交互的函数,一般这种可以直接作用于操作系统的函数是非常不安全的,对于这种不安全的函数,总是要做一些措施来进行保护

php artisan make:migration create_table_cars --create=cars
php artisan make:migration create_table_cars --create=cars
Created Migration: 2017_03_04_160644_create_table_cars
/data/htdocs/lumen.levoo.com/database/migrations/2017_03_04_160644_create_table_cars.php

    public function up()
    {
        Schema::create('cars', function (Blueprint $table) {
            $table->increments('id');
            $table->string('make');                                                                                                                                  
            $table->string('model');
            $table->string('year');
            $table->timestamps();
        });
    }



php artisan migrate
Migrated: 2017_03_04_161708_create_table_cars

migrations记录历史 /car 两个表:
id int(10) UNSIGNED
make  varchar(255)
model varchar(255)
year varchar(255)
create d_attimestamp


问题实践来源:http://www.cnblogs.com/crisenchou/p/6237781.html
打开方法来自:http://www.codesec.net/view/497671.html?winzoom=1



Model这块和Controll层的配置:
1)Controll层, /data/htdocs/lumen.levoo.com/app/Http/Controllers/TestController.php

<?php

namespace App\Http\Controllers;
use App\Models\Information;
use App\Models\Collection;

//use App\User;     //新增部分APP目录下
use App\Models\User; //App\Models\User目录下
use Laravel\Lumen\Routing\Controller as BaseController;
use Illuminate\Http\Request;

class TestController extends BaseController
{
    //直接传人sql方式操作数据库
    function index(Request $request){
        /*
            $UserModel = new User();
            $result = $User::all(); //这样也成
            $result2 = $UserModel::all2(); //这样也成
        */
        $result = User::all();
        $result2 = User::all2();//这个在Model自定义的all2也能被调用输出结果

        print_r($result);
        echo "<hr>";                                                                                                                                                                                          
        print_r($result2);
    }
}


2)Model层:/data/htdocs/lumen.levoo.com/app/Models/User.php

<?php
//namespace App; //这个得注释掉,容易和App/User.php发生错误引用。
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
//默认操作数据库的users表,需要定制的话请看文档,下面有自己的配置。
class User extends Model
{
    /**
    * The connection name for the model.
    *
    * @var string
    */
    protected $connection = 'mysql';

    /**
    * 表名
    *
    * @var string
    */
    protected $table = 'levoo_sns_user'; //指定操作表名
    protected $primaryKey = "id";        //指定主键
    public $timestamps = false;
    protected $dateFormat = 'U';

    static public function all2(){
        $User = User::all();
        return $User;                                                                                                                                                                                          
    }
}


=================MVC模板学习=============================
/data/htdocs/lumen.levoo.com/app/Http/Controllers/TestController.php

<?php

namespace App\Http\Controllers;
use App\Models\Information;
use App\Models\Collection;

//use App\User;     //新增部分APP目录下
use App\Models\User; //App\Models\User目录下
use Laravel\Lumen\Routing\Controller as BaseController;
use Illuminate\Http\Request;

class TestController extends BaseController
{
    //直接传人sql方式操作数据库
    function index(Request $request){
        /*
            $UserModel = new User();
            $result = $User::all(); //这样也成
            $result2 = $UserModel::all2(); //这样也成
        */
        $result = User::all();
        //$result2 = User::all2();//这个在Model自定义的all2也能被调用输出结果
        /*
        print_r($result);                                                                                                                                            
        echo "<hr>";
        print_r($result2);
        */
        //view()->exists('user');
        return view('test', ['name' => 'jackX','results' => $result]);
    }
}


vi /data/htdocs/lumen.levoo.com/resources/views/test.blade.php


<!-- 该视图存放 resources/views/greeting.php -->

<html>
    <body>
        <h1>Hello, {{ $name }}</h1>
        <h1>Hello, {{ $name2 or 'Default' }}</h1>
        <h1>Hello, {!! $name !!}</h1>
        <h1>Array, {{ $results}}</h1>
        <h1>Array, {!! $results !!}</h1>
        Blade for each:<br>
        <h1>
            @foreach ($results as $user)
                <ul>
                <li>This is user {{ $user->id }}</li>
                <li>This is user {{ $user->mobile }}</li>
                <li>This is user {{ $user->fansmobile }}</li>
                <li>This is user {{ $user->followedTime }}</li>
                </ul>
            @endforeach
        </h1>
        <h1>
            @foreach ($results as $user)
                <ul>
                @if ($user->id == 1)
                   用户Id=1,标识一下:
                @endif
                <li>This is user {{ $user->id }}</li>
                <li>This is user {{ $user->mobile }}</li>
                <li>This is user {{ $user->fansmobile }}</li>
                <li>This is user {{ $user->followedTime }}</li>
                </ul>
            @endforeach
        </h1>
        <h1>只显示id=1的区块:</h1>
        <h1>
            @foreach ($results as $user)
                <ul>
                 @continue($user->id == 2)
                <li>This is user {{ $user->id }}</li>
                <li>This is user {{ $user->mobile }}</li>
                <li>This is user {{ $user->fansmobile }}</li>
                <li>This is user {{ $user->followedTime }}</li>
                </ul>
                 @break($user->id == 1)
            @endforeach
        </h1>
    </body>
</html>




模板输出:http://123.57.252.183/test/index
Hello, jackX

Hello, Default

Hello, jackX

Array, [{"id":1,"mobile":"1881**65108","fansmobile":"18810322234","followedTime":1211212121},{"id":2,"mobile":"1881**65108","fansmobile":"18810322232","followedTime":121212}]

Array, [{"id":1,"mobile":"1881**65108","fansmobile":"18810322234","followedTime":1211212121},{"id":2,"mobile":"1881**65108","fansmobile":"18810322232","followedTime":121212}]

Blade for each:
This is user 1
This is user 1881**65108
This is user 18810322234
This is user 1211212121
This is user 2
This is user 1881**65108
This is user 18810322232
This is user 121212
用户Id=1,标识一下:
This is user 1
This is user 1881**65108
This is user 18810322234
This is user 1211212121
This is user 2
This is user 1881**65108
This is user 18810322232
This is user 121212
只显示id=1的区块:

This is user 1
This is user 1881**65108
This is user 18810322234
This is user 1211212121

这个叫Blade的模板引擎解析成PHP的,也就是相当于没有啥大的损耗,如果它的算法还算先进的前提下,位置在:
/data/htdocs/lumen.levoo.com/storage/framework/views/9e3b647aebb6a248d1ae42408e87c3fc7f5bc520.php
为什么这么说呢,如下,我在想为何要搞成这样,PHP裸写不也一样么,像Ci框架啥的,思考思考,这样也算是能模板和程序分离罢:


        <h1>只显示id=1的区块:</h1>
        <h1>
            <?php $__currentLoopData = $results; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $user): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
                <ul>
                 <?php if($user->id == 2) continue; ?>
                <li>This is user <?php echo e($user->id); ?></li>
                <li>This is user <?php echo e($user->mobile); ?></li>
                <li>This is user <?php echo e($user->fansmobile); ?></li>
                <li>This is user <?php echo e($user->followedTime); ?></li>
                </ul>
                 <?php if($user->id == 1) break; ?>
            <?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
        </h1>



主要是对这个模板有一个大体理解,和Smarty啥的有一个初步了解,参考自:
http://laravelacademy.org/post/6780.html




======================================================================
Nginx配置文件:

server
{
    listen       80 default_server;
    server_name  101.200.189.210 lumen.levoo.com;
    index index.html index.htm index.php;
    root  /data/htdocs/lumen.levoo.com/blog/public;
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;


    location ~ .*\.(php|php5)?$
    {
        fastcgi_pass unix:/dev/shm/php-fcgi.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;
        #if (!-f $request_filename){                                                                                                  
        #    rewrite ^/(.+)$ /index.php?s=$1 last;
        #    break;
        #}
    }
    access_log /data/logs/nginx/access_lumen_levoo.log;
}



上面location / {里被注释掉的也成,只是优雅度不够,这块好像手册有说明,我当时把 try_files $uri $uri/ /index.php?$query_string;放到location ~ .*\.(php|php5)?$ 里了,发现不对。

http://123.57.252.183/foo
Hello World


老外:
http://stackoverflow.com/questions/32281294/lumen-simple-route-request-doesnt-work
老外也有这个问题:
http://laravel.io/forum/05-08-2014-nginx-laravel-routing-shows-404?page=1

主从数据库配置(多台读库配置):
http://blog.sina.com.cn/s/blog_9bbafb790102win1.html
基于Lumen搭建一个OAUTH2认证的API框架:
http://www.bibihub.com/php/lumen-mobile-api-oauth-2-authentication/

========DB学习=========
基本使用
注意:如果你想要使用DB门面,应该取消bootstrap/app.php文件中$app->withFacades()调用前的注释
vi bootstrap/app.php

下面这个需要门面:

$app->get('/foo', function () use ($app) {
    $results = app('db')->select("SELECT * FROM levoo_sns_user");
    print_r($results);
    $results = DB::select("SELECT * FROM levoo_sns_user");//这个需要门面
    print_r($results);
    return 'Hello World';                                          
});

一些报错的日志:SQLSTATE[HY000] [2002] Connection refused
grep: ./survey/config_production/config_production: Too many levels of symbolic links
./survey/config_production/app.php:    'lumen_log_path'=>'/data/logs/lumen/survey.log',  //框架日志
grep: ./survey/config/config_production: Too many levels of symbolic links
./survey/config/app.php:    'lumen_log_path'=>'/data/logs/lumen/survey.log',  //框架日志
tail -f survey.log
Next Illuminate\Database\QueryException: SQLSTATE[HY000] [2002] Connection refused (SQL: select count(*) as aggregate from `survey` where `type` = 0 and `user` = 271 and `state` = 0) in /data/www/ms/lumen-clear-edition/vendor/illuminate/database/Connection.php:664
composer config -g repo.packagist composer https://packagist.phpcomposer.com #换国内镜像URL地址。
composer是一个可执行命令,你在一个空目录下写一个composer.json
然后执行composer update,就能生成。
====================两步:软链接composer/PATH/下载autoloader===========================
软链接加PATH,/usr/local/composer/composer -> composer.phar:
ls /usr/local/composer/
composer  composer.phar

cat /etc/profile.d/composer.sh
PATH=$PATH:/usr/local/composer
export PATH
source /etc/profile.d/composer.sh


cd /usr/local/kafka-php
cat composer.json
{
        "require": {
                "nmred/kafka-php": "0.2.*"
        }
}

composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 3 installs, 0 updates, 0 removals
  - Installing amphp/amp (v1.2.2): Downloading (100%)        
  - Installing psr/log (1.0.2): Downloading (100%)        
  - Installing nmred/kafka-php (v0.2.0.8): Downloading (100%)        
Writing lock file
Generating autoload files

cd /usr/local/kafka-php
composer.json  composer.lock  vendor
目的是看下同事所说的Kafka死光了,kafka-php会退出的问题:
https://github.com/weiboad/kafka-php

===========================================================================

cd /usr/local/composer  ,sudo -u www -H composer.phar install ,会去读取:/usr/local/composer/composer.json文件。
chown -R www.www /data/htdocs/sd.levoo.com #否则会报:/data/htdocs/sd.levoo.com/vendor does not exist and could not be created.
sudo -u www -H composer.phar install

实践如下:


vi /etc/sudoers
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/mysql/bin:/usr/local/composer:/usr/local/php/bin


#sudo -u www -H composer.phar config -g repo.packagist composer https://packagist.phpcomposer.com                                                                                                    
  [ErrorException]                                                                                  
  touch(): Unable to create file /home/www/.composer/config.json because No such file or directory  

#mkdir  /home/www
#chown www.www /home/www
#chmod 755 /home/www
#sudo -u www -H composer.phar config -g repo.packagist composer https://packagist.phpcomposer.com


#sudo -u www -H composer.phar install
Composer could not find a composer.json file in /usr/local/composer
To initialize a project, please create a composer.json file as described in the https://getcomposer.org/ "Getting Started" section

建立composer.json如下,可以根据需要添加你所依赖的库,但下面一定得包含在内,autoload必须要指定app和test的目录不得省略。

{
  "require": {
    "tmtbe/swooledistributed":">2.0.0"
  },
"autoload": {
    "psr-4": {
      "app\\": "src/app",
      "test\\": "src/test"
    }
  }
}
/usr/local/composer/composer.json
运行:
#sudo -u www -H composer.phar install
Loading composer repositories with package information
Updating dependencies (including require-dev)
  [RuntimeException]                                                  
  /usr/local/composer/vendor does not exist and could not be created.

  [RuntimeException]                                                                
  /usr/local/composer/vendor/symfony/intl does not exist and could not be created

  - Installing symfony/intl (v3.3.8):
                                                                                          
  [Symfony\Component\Process\Exception\RuntimeException]                                  
  The Process class relies on proc_open, which is not available on your PHP installation.  
      
PHP需有proc_open,得从PHP的php.ini里给去掉:
; disable_functions = chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_
restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket

#sudo -u www -H composer.phar install
Composer could not find a composer.json file in /usr/local/php/etc
To initialize a project, please create a composer.json file as described in the https://getcomposer.org/ "Getting Started" section
得cd到:/usr/local/composer 里,再执行:sudo -u www -H composer.phar install
#sudo -u www -H composer.phar install
  [ErrorException]                                          
  proc_get_status() has been disabled for security reasons   和上面一样:得从PHP的php.ini里给去掉。
  [RuntimeException]                                          
  Could not delete /usr/local/composer/vendor/symfony/intl:
  chown -R www.www  /usr/local/composer/vendor
  [ErrorException]                                                              
  file_put_contents(./composer.lock): failed to open stream: Permission denied   #写入/usr/local/composer/composer.lock权限不够。
[root@gitlab-jenkins_php-redis_123.57.252.183:/usr/local]
#chown www.www composer
#sudo -u www -H composer.phar install
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Writing lock file
Generating autoload files
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。


From:https://getcomposer.org/download/
http://blog.csdn.net/yoywow/article/details/52074512

二、使用composer安装laravel/lumen:
遇到问题:
修改 composer 的全局配置文件(推荐方式)

打开命令行窗口(windows用户)或控制台(Linux、Mac 用户)并执行如下命令:
[root@a composer]# chtdocs
[root@a htdocs]# cd lumen.levoo.com/
[root@a lumen.levoo.com]# /usr/local/composer/composer.phar global require "laravel/lumen-installer"
Changed current directory to /root/.config/composer
Do not run Composer as root/super user! See https://getcomposer.org/root for details
compser 执行命令提示do not run composer as root/super !
这个是因为composer为了防止非法脚本在root下执行,解决办法随便切换到非root用户即可
PATH变量设置Ok的方法如下:
打开~/.bashrc
sudo vim ~/.bashrc
添加行:
export PATH=$PATH:/home/lumen/.config/composer/vendor/bin


用Linux系统。比如要把/etc/apache/bin目录添加到PATH中,方法有三:
1.#PATH=c/etc/apache/bin
使用这种方法,只对当前会话有效,也就是说每当登出或注销系统以后,PATH 设置就会失效

2.#vi /etc/profile
在适当位置添加 PATH=$PATH:/etc/apache/bin (注意:= 即等号两边不能有任何空格)
这种方法最好,除非你手动强制修改PATH的值,否则将不会被改变

3.#vi ~/.bash_profile
修改PATH行,把/etc/apache/bin添加进去
这种方法是针对用户起作用的
From:http://opsmysql.blog.51cto.com/2238445/665990


lumen没有成功:



useradd lumen
su lumen
cd /data/htdocs/laravel.levoo.com
/usr/local/composer/composer.phar  config -g repo.packagist composer https://packagist.phpcomposer.com


进行上述设置后,laravel有门,能下载了:
[lumen@a laravel.levoo.com]$ pwd
/data/htdocs/laravel.levoo.com
[lumen@a laravel.levoo.com]$ /usr/local/composer/composer.phar global require "laravel/lumen-installer"  
Changed current directory to /home/lumen/.config/composer
Using version ^1.0 for laravel/lumen-installer
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 10 installs, 0 updates, 0 removals
  - Installing symfony/process (v3.2.1) Downloading: 100%        
  - Installing psr/log (1.0.2) Downloading: 100%        
  - Installing symfony/debug (v3.2.1) Downloading: 100%        
  - Installing symfony/polyfill-mbstring (v1.3.0) Downloading: 100%        
  - Installing symfony/console (v3.2.1) Downloading: 100%        
  - Installing guzzlehttp/promises (v1.3.1) Downloading: 100%        
  - Installing psr/http-message (1.0.1) Downloading: 100%        
  - Installing guzzlehttp/psr7 (1.3.1) Downloading: 100%        
  - Installing guzzlehttp/guzzle (6.2.2) Downloading: 100%        
  - Installing laravel/lumen-installer (v1.0.2) Downloading: 100%        
symfony/console suggests installing symfony/event-dispatcher ()
symfony/console suggests installing symfony/filesystem ()
Writing lock file
Generating autoload files


生成文件如下:
[lumen@a composer]$ pwd
/home/lumen/.config/composer

[lumen@a composer]$ ls  /home/lumen/.config/composer
auth.json  composer.json  composer.lock  config.json  vendor


开始学习数据库:
http://blog.csdn.net/wowkk/article/details/52104689

/data/htdocs/lumen.levoo.com/blog/.env
APP_ENV=local
APP_DEBUG=true
APP_KEY=
APP_TIMEZONE=UTC

DB_CONNECTION=mysql
DB_HOST=10.44.202.177
DB_PORT=3306
DB_DATABASE=levoo_egg
DB_USERNAME=levoo
DB_PASSWORD=new@levoo.com

CACHE_DRIVER=memcached
QUEUE_DRIVER=sync

/data/htdocs/lumen.levoo.com/blog/app/Http/Controllers/AccountController.PHP


/data/htdocs/lumen.levoo.com/blog/routes/web.php
<?php

$app->group(["namespace"=>"App\Http\Controllers"], function()use($app){
    //账户控制器
    $app->get("/AccountController",["uses" => "AccountController@accountController"]);
});


model:/data/htdocs/lumen.levoo.com/blog/app/Models/User.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
class User extends Model
{
}



在app/Http/Controllers目录下AccountController.php,修改为

<?php

namespace App\Http\Controllers;

use App\user;   //新增部分
use Laravel\Lumen\Routing\Controller as BaseController;
use Illuminate\Http\Request;

class AccountController extends BaseController
{
    //直接传人sql方式操作数据库
    function accountController(Request $request){
        return User::all();
    }
}

http://101.200.189.210/AccountController/accountController


调试栏(Laravel Debug Bar)
PHP调试栏项目无疑是一个巨大的成功,你无需到处编写var_dump。Laravel调试栏对该组件作了扩展,包含了路由、视图、事件以及更多信息。
这使得调试变得更加简单、快速,提高你的开发效率。

Confide
认证模块,包含了登录、注册、退出、密码重置等功能。

代码生成器(Laravel Generators)
使用简单的命令行就可以自动根据代码模板生成Model/View/Controller代码以及模块(Module)。


HTML压缩器(Laravel HTML Minify)
让你的页面减小大概18%,提升性能必备

后台管理(Laravel Administrator)
Laravel Administrator帮助开发者快速构建后台管理界面,无需重复构建。

OAuth 4 Laravel:OAuth支持
OAuth 2服务器:安全和100%标准兼容的OAuth服务器

摘自下载量最高的 100 个 Laravel 扩展包推荐:
https://laravel-china.org/topics/2530

阅读全文
背景:像做点PHP给那个下位机,也就是现在的物联网芯片发送指令这种,用到这样的一个串,发送下去后,下位机解析后(解析到串里部分值修改后原样返回)再以串返回,自己想对串里作修改啥的用到这种url参数结构,如:framefd=4&fd=1&act=display&command=gettemp,解析在数组,同数组里的key=>value再解析成串。
parse_url
parse_str




From:http://www.cnblogs.com/freespider/p/4262244.html
背景:像做一些标识位、状态位,在早期的c语言或c++里都是通过一个位运算符来做的,这块PHP也在上面作了一些借鉴,对于爱放在数据库里和从数据库取东西的php程序,如果状态位很多,你想多个数据库表字段实现是不灵活的,哪天再来一个状态怎么办?所以,本文的思想就是用位运算达到灵活性之目的,故而转载此文。

PHP中的位运算和进制是比较冷门的知识,感觉很简单也很好理解,但是在实际场景中却很少使用,本篇博文就是简单了解基本概念以及讲解如何去实际使用.
位运算
PHP中的位运算符是对整形进行的操作,比如对于十进制,二进制,八进制等数字的一些操作.
& (按位与 AND)
| (按位或 OR)
~ (按位取反 NOT)
^ (按位异或 XOR)
<< (bitwise left shift)
>> (bitwise right shift)
下面用一个实际例子来说明如何去使用它们,比如一个博客系统最重要的元素就是文章,而文章可以有很多状态,比如状态可以是删除,评论,收藏,喜欢,当然可以根据实际情况扩展,那在数据库表中如何进行设计呢?假如通过每个字段来存储文章的状态,一方面表的可扩展性很差,另外一方面查询效率很差.
这个时候可以通过一个status字段来保存这些状态,这个字段的类型是整形,可以存储十进制,八进制,二进制,十六进制.
那么这么多状态`如何在一个字段值中表示呢,可以进行如下规定:
整数(二进制)  状态  说明
0001  删除状态  第一位等于1
0010  评论状态  第二位等于1
0100  收藏状态  第三位等于1
1000  喜欢状态  第四位等于1
面临的第一个问题,如何给文章增加状态属性?
$status = $status | 0b0001 ; //文章被置为删除状态$status = $status | 0b0010 ; //文章被置为评论状态$status = $status | 0b1100 ; //文章同时被置为收藏和喜欢状态
面临的第二个问题,如何给文章取消状态属性?
$status = $status & ~0b0001 ; //文章从删除状态恢复$status = $status & ~0b0010 ; //文章从评论状态恢复$status = $status & ~0b1100 ; //文章同时从收藏和喜欢状态恢复
面临的第三个问题,如何检查文章的状态?
$status & 0b0001?true:false ; //查询文章是否是删除状态$status & 0b0010?true:false ; //查询文章是否是评论状态$status & 0b1100?true:false ; //查询文章是否是收藏和喜欢状态
希望通过上面的例子你能明白位运算符的作用,另外位运算符和逻辑运算符比较容易让人误解.可以这样去区分和理解:
位运算符是对两个整数的bits进行操作,然后返回结果,That means it's not a yes or no thing.
假如位运算符被用在条件语句中,他们将会进行逻辑比较.
逻辑操作符是比较多个表达式,然后返回true或者false.
进制运算
上面位运算符的例子中,作为操作符数的都是二进制,但是也可以是其它进制.
PHP中支持二进制(binary),八进制(octal),十进制(decimal),十六进制(hexadecimal).
它们都是整型,进制和编码密切相关,这里仅仅说明PHP中的进制是如何表达的,以及之间是如何转换的.
如何在整型变量定义进制:
$n = 0b10000 ; //二进制$n = 16; //十进制$n = 0x10; //十六进制$n = 020;//八进制在echo输出的时候,不管是什么类型的整数,最后输出的都是十进制
定义字符串的时候如何通过进制表示:
//\[0-7]{1,3} #八进制表达方式//\x[0-9A-Fa-f]{1,2} #十六进制表达方式$str = "\20";$str = "\x10";echo输出的时候,会输出字符DLE
PHP内部函数如何支持进制转换,共有二种转换方式:
$n = 16;echo dechex($n) . "_" . decbin($n);$n = base_convert('10',16,10 ); //'10'本身的进制由第二个参数决定$nn = base_convert($n, 10,2 );echo $n . "_" . $nn ;//以上的函数返回各进制的字符串表达形式,那么如何返回这些变量代表的字符呢.echo  chr(base_convert('10',16,10 ));
sprintf如何在进制中使用:
这个函数实际上和进制没有非常耦合的关系,可以将不同进制的整型转换为不同进制的字符串表示
$n = sprintf("%x",  0b10000 );$n = sprintf("%x",  0x10 );$n = sprintf("%x",  020 );$n = sprintf("%x", 16 );$n = sprintf("%x", "a" );$n = sprintf("%s",  0b10000 );$n = sprintf("%c",  0b10000 );#返回ASCII值对应的字符

摘自:https://buluo.qq.com/p/detail.html?bid=13609&pid=5730935-1481030480&from=grp_sub_obj
背景:PHP5.5 在centos6 64位下编译报错,之前在另一台rpmbuild机上不存在这个问题。


解决办法:

vim /etc/ld.so.conf.d/local.conf     # 编辑库文件
/usr/local/lib                       # 添加该行
:wq                                  # 保存退出
ldconfig -v                          # 使之生效

注意事项:
这里添加的库文件路径一定要和你系统平台arch一致,32bit的系统直接添加/usr/local/lib即可,64bit系统要填加/usr/local/lib64.否则依旧会报错,我当时就是添加了/usr/local/lib死活编辑不了,后来更改为
/usr/local/lib64才可以。切记

http://lovelace.blog.51cto.com/1028430/1314571
背景:阿里搞的lvs,在七层交换时出现获取不到正确的remote_addr的情况,昨天那个取不到remote_ip的把lvs修改成4层交换就O了,可以通过$ip=$_SERVER["REMOTE_ADDR"]; 获取到用户端的出口IP的。


(1).REMOTE_ADDR:浏览当前页面的用户计算机的ip地址

(2).HTTP_X_FORWARDED_FOR: 浏览当前页面的用户计算机的网关

(3).HTTP_CLIENT_IP:客户端的ip

在PHP 中使用 $_SERVER["REMOTE_ADDR"] 来取得客户端的 IP 地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取。

不过要注意的事,并不是每个代理服务器都能用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取客户端的真实 IP,有些用此方法读取到的仍然是代理服务器的 IP。

还有一点需要注意的是:如果客户端没有通过代理服务器来访问,那么用$_SERVER["HTTP_X_FORWARDED_FOR"] 取到的值将是空的。
来自:http://www.jb51.net/article/27880.htm
更详细的解释如下:


REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP。如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP。
HTTP_CLIENT_IP 是代理服务器发送的HTTP头。如果是“超级匿名代理”,则返回none值。同样,REMOTE_ADDR也会被替换为这个代理服务器的IP。
$_SERVER['REMOTE_ADDR']; //访问端(有可能是用户,有可能是代理的)IP
$_SERVER['HTTP_CLIENT_IP']; //代理端的(有可能存在,可伪造)
$_SERVER['HTTP_X_FORWARDED_FOR']; //用户是在哪个IP使用的代理(有可能存在,也可以伪造)

三个值区别如下:

一、没有使用代理服务器的情况:

REMOTE_ADDR = 您的 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示

二、使用透明代理服务器的情况:Transparent Proxies

REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。

三、使用普通匿名代理服务器的情况:Anonymous Proxies

REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。

四、使用欺骗性代理服务器的情况:Distorting Proxies

REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 随机的 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。

五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)

REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。

//获取用户IP
$ip = '';
foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_FROM', 'REMOTE_ADDR') as $v) {
   if (isset($_SERVER[$v])) {
       if (! preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/', $_SERVER[$v])) {
                continue;
   }
          $ip = $_SERVER[$v];
   }
}

uset($ip,$v);

来自:http://www.cnblogs.com/jackluo/archive/2013/03/03/2941411.html
背景:看PHP的慢日志一般来讲主要是看网络接口上的问题,有时间一台服务器会调用api接口,而该接口呢在另一吧机器上,而有人恶意透过这个接口频繁调用,飙高带宽,进而导致一堆TIME_WAIT,nginx出现白页,此时,这是现象,如何由现象看到本质,那就打开php-fpm的slow的日志吧,如何打开,接着向下看吧。
——————————————————————————————————————————————————————————————————————
众所周知,mysql有slow query log,根据慢查询日志,我们可以知道那些sql语句有性能问题。作为mysql的好搭档,php也有这样的功能。如果你使用php-fpm来管理php的话,你可以通过如下选项开启。
PHP 5.3.3 之前设置如下:
<value name="request_slowlog_timeout">5s</value>
<value name="slowlog">logs/php-fpm-slowlog.log</value>

说明:
request_slowlog_timeout 是脚本超过多长时间 就可以记录到日志文件
slowlog 是日志文件的路径

开启后,如果有脚本执行超过指定的时间,就会在指定的日志文件中写入类似如下的信息:


[19-Dec-2013 16:54:49] [pool www] pid 18575
script_filename = /home/web/htdocs/sandbox_canglong/test/tt.php
[0x0000000003a00dc8] curl_exec() /home/web/htdocs/sandbox_canglong/test/tt.php:2
[0x0000000003a00cd0] exfilter_curl_get() /home/web/htdocs/sandbox_canglong/test/tt.php:6
日志说明:
script_filename 是入口文件
curl_exec() : 说明是执行这个方法的时候超过执行时间的。
exfilter_curl_get() :说明调用curl_exec()的方法是exfilter_curl_get() 。
每行冒号后面的数字是行号。

开启后,在错误日志文件中也有相关记录。如下:





参考:http://www.bo56.com/%E5%96%84%E7%94%A8php-fpm%E7%9A%84%E6%85%A2%E6%89%A7%E8%A1%8C%E6%97%A5%E5%BF%97slow-log%EF%BC%8C%E5%88%86%E6%9E%90php%E6%80%A7%E8%83%BD%E9%97%AE%E9%A2%98/
背景: 深入理解PHP原理之变量分离/引用(Variables Separation)   之自己+1,这个refcount是否+1的问题。
Q:
有时候会在原有数值的基础上改变吧 比如$var++
A:两种情况,那个对象就不测试了:
情况1,字符:


---------- 调试PHP ----------
string(5) "jackX" refcount(2)
string(5) "jackY" refcount(2)

输出完成 (耗时 0 秒) - 正常终止


情况2,整数:


---------- 调试PHP ----------
long(1) refcount(2)
long(2) refcount(2)

输出完成 (耗时 0 秒) - 正常终止

说明,$var++; 并没有改变自己的refcount值。而像:$var_dup = $var;就会+1了哟:



---------- 调试PHP ----------
string(5) "jackX" refcount(2)
string(5) "jackY" refcount(3)  <---看,这儿+1,等于3了,$var_dup = $var;会加1,得证。

输出完成 (耗时 0 秒) - 正常终止
实践来源:http://www.laruence.com/2008/09/19/520.html


疑问:


---------- 调试PHP ----------
string(8) "laruence" refcount(3)
string(8) "laruence" refcount(3)
long(1) refcount(2)
string(8) "laruence" refcount(2)

输出完成 (耗时 0 秒) - 正常终止

可能是:
作为函数的参数穿进去的时候,函数的实参使用了,所以+1,函数电用完,实参也回收了,所以变回2,应该是这样,实践如下:

---------- 调试PHP ----------
string(9) "jackxiang" refcount(2)
string(9) "jackxiang" refcount(2)
string(9) "jackxiang" refcount(2)

输出完成 (耗时 0 秒) - 正常终止

运行debug_zval_dump后不是又变回去了?按这样说,那前面的结论都TM错了,$var ++,其refcount也是加了1的。这就是结论。要看是这么玩的,得看PHP这块的源代码。

分页: 2/24 第一页 上页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 下页 最后页 [ 显示模式: 摘要 | 列表 ]