laravel dcat-admin multipleSelectTable options 自定义内容

按照官方文档给 multipleSelectTable options 设置自定义内容始终无效,研究了底层代码,才发现需要和value匹配,才能正常显示。

$form->multipleSelectTable('company_ids', '出品方')
        ->title('选择出品方')
        ->from(ProductionCompanyTable::make(['id' => $form->getKey()]))
        ->value(function(){
            return '1,2,3'; 
            //注意:此处返回option里的key值才能正常加载options方法中返回的内容!!此处的字符串主要是显示在前端hidden元素中, 用于表单提交参数用的,所以必须返回。
        })
        ->options() {
            return [1 => '选项A', 2 => '选项B', 3 => '选项C']; 
            //需要加载时显示的选项,key与上面value()中的值对应,如果value中不存在options()中的某个key,则该key对应的选项不会显示出来。
        }
    }
    return [];
});

底层SelectTable处理option的主要逻辑:

隐藏http头里的X-Powered-By php版本号

1.找到php.ini

$ php -i | grep "Loaded Configuration File"
Loaded Configuration File => /usr/local/php/etc/php.ini
$ vim /usr/local/php/etc/php.ini

2.修改 expose_php 将 On 改成 Off
3.重启php
4.打开浏览器检测,顺便用lynx在命令行中看下

$ lynx -head -mime_header http://localhost 
或者
$ lynx -head -mime_header http://server-address

git hooks pre-commit git挂钩防范于未然 提交前的自我检查

这几天抽空看了一下git文档,发现有个hooks的好东西,在开发过程中常常不小心会把一些不想提交的文件给提交进去,也常常在提交代码后发现 文件有语法错误,这样的提交一旦上线后很可能会导致正式环境出现严重的问题。

今天就说一下 pre-commit 这个hook,它会在你执行 git commit 操作的时候触发,如果该hook返回1,那么这次的 commit 将会被终止。

hook 位于 .git/hooks/ 目录下,可以看到很多 .sample 的文件这些都是示例文件,我们自己建一个 pre-commit 文件,里面可以写shell脚本,比如我写了一个检查php语法错误和config文件不可被提交进去的脚本

#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments.  The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".

ROOT_DIR="$(pwd)/"
LIST=$(git diff-index --name-only --diff-filter=ACMR HEAD)
ERRORS_BUFFER=""
for file in $LIST
do
    EXTENSION=$(echo "$file" | grep "config.php$")
    if [ "$EXTENSION" != "" ]; then
        echo "注意:有config文件要提交!如果确定要提交可用 git commit --no-verify 来忽略";
        exit 1
    fi
    EXTENSION=$(echo "$file" | grep ".php$")
    if [ "$EXTENSION" != "" ]; then
        ERRORS=$(php -l $ROOT_DIR$file 2>&1 | grep "Parse error")
        if [ "$ERRORS" != "" ]; then
            if [ "$ERRORS_BUFFER" != "" ]; then
                ERRORS_BUFFER="$ERRORS_BUFFERn$ERRORS"
            else
                ERRORS_BUFFER="$ERRORS"
            fi
            echo "检测到有语法错误的php文件: $file "
        fi
    fi
done
if [ "$ERRORS_BUFFER" != "" ]; then
    echo
    echo "Found PHP parse errors: "
    echo -e $ERRORS_BUFFER
    echo
    echo "PHP parse errors found. Fix errors and commit again."
    exit 1
else
    echo "No PHP parse errors found. Committed successfully."
fi

大功告成,测试一下:

pre-commit

pre2

php cgi socket: Too many open files

Too many open files经常在使用linux的时候出现,大多数情况是您的程序没有正常关闭一些资源引起的,所以出现这种情况,请检查io读写,socket通讯等是否正常关闭 错误信息:


create_debugger_socket("127.0.0.1", 9002) socket: Too many open files

用 ulimit -a  查看了一下 只有 256


ulimit -a

open files                      (-n) 256

使用 ulimit -n 命令来提高 open files 数


ulimit -n 1024

当然这个只是临时的修改,关闭终端后就失效了 我们可以通过修改 /etc/launchd.conf 文件来使其永久生效 如果系统中不存在launchd.conf我们就创建一个,如果已存在 则在最后添加

sudo vim /etc/launchd.conf

添加以下内容 limit maxfiles 65536 65536 修改后重启电脑然后再通过 ulimit -a 查看

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65536
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited

参考文章:http://artincube.com/too-many-open-files-limit-on-mac-os-x-ptgui-pro/

php 高并发 memcache 锁

<br />
	private function lock(){<br />
		$lock_name = "mb_lock";<br />
		$memcache = new Memcache();<br />
		$memcache-&gt;connect("127.0.0.1", 11211);<br />
		$locked = $memcache-&gt;add($lock_name, 1, false, 30);<br />
		if($locked){<br />
			return true;<br />
		}else{<br />
			$wait = 1;<br />
			while ($wait) {<br />
				if(!$locked){<br />
					usleep(rand(1,100)*1000);<br />
					$locked = $memcache-&gt;add($lock_name, 1, false, 30);<br />
					CakeLog::write("debug","wait:".$wait);<br />
					$wait ;<br />
					if($wait == 10){<br />
						break;<br />
					}<br />
				}else{<br />
					return true;<br />
				}<br />
			}<br />
		}<br />
		return $locked;<br />
	}</p>
<p>	private function un_lock(){<br />
		$lock_name = "mb_lock";<br />
		$memcache = new <a href="http://www.cillap.com/">beste online casino</a>  Memcache();<br />
		$memcache-&gt;connect("127.0.0.1", 11211);<br />
		return $memcache-&gt;delete($lock_name, 0);<br />
	}</p>
<p>	function test(){<br />
		$locked = $this-&gt;lock();<br />
		if($locked){<br />
			// usleep(1000*100);<br />
			$this-&gt;loadModel("AbTest");<br />
			$data = $this-&gt;AbTest-&gt;find("first",array("conditions"=&gt;array("sold"=&gt;0)));<br />
			if(!empty($data)){<br />
				$this-&gt;loadModel("AbAddTest");<br />
				$this-&gt;AbAddTest-&gt;create();<br />
				$this-&gt;AbAddTest-&gt;save(array("test_id"=&gt;$data["AbTest"]["id"],"time"=&gt;time()));<br />
				$data["AbTest"]["sold"] = 1;<br />
				$this-&gt;AbTest-&gt;save($data);<br />
			}</p>
<p>			CakeLog::write("debug","success");<br />
			echo &quot;success&quot;;<br />
			$this-&gt;un_lock();<br />
		}else{<br />
			echo &quot;error&quot;;<br />
			CakeLog::write("debug","success");<br />
		}</p>
<p>	}<br />

<br />
home$ ab -n 1000 -c 10 http://local.www.xd.com/games/test<br />

在未使用memcache锁时,使用ab进行并发测试,会有很大几率出现重复数据的插入。
在使用memcache锁后,用ab进行并发测试,已经解决了上述问题

php过滤html标签

php过滤html的函数:strip_tags(string) 这样就可以过滤掉所有的html标签了。
如果想过滤掉除了<img src=””>之外的所有html标签,则可以这样写:strip_tags(string,”<img>”);
过滤除了<img src=””><p>xxx</p><b></b>之外的所有html标签,则可以这样写:strip_tags(string,”<img><p><b>”);