PHP opcache 缓存加密功能

开启opcache扩展后,添加以下的配置
[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0
;opcache.revalidate_freq=60
opcache.file_cache=/www/opcache
opcache.file_cache_only=0
opcache.save_comments=0
opcache.enable_file_override=1

将代码使用opcache_compile_file函数编译好后清空源码文件,这样就起到了隐藏源码的功能。

function opcache_compile_files($dir)
{
    $directory = new RecursiveDirectoryIterator($dir);
    $iterator = new RecursiveIteratorIterator($directory);
    foreach ($iterator as $v)
    {
        if (!$v->isDir() && preg_match('%\.php$%', $v->getRealPath())) {
            opcache_invalidate($v->getRealPath(), true);
            opcache_compile_file($v->getRealPath());
            file_put_contents($v->getRealPath(), '');
        }
    }
}
opcache_compile_files('/www/www.baidu.com');
不足的地方是如果重启服务器或者php-fpm 程序就不能运行了。

c++ 磁盘读写

#include <iostream>
#include <string>
#include <fstream>

int main()
{
	string instId = "00001";
	double price = 3500;

	ofstream fout("test.txt", ios::app);
	fout << "合约代码:" << instId.c_str() << " 价格:" << price << endl;
	fout << "合约代码:" << instId.c_str() << " 价格:" << price + 50 << endl;
	fout.close();
	return 0;
}

int main()
{
	string instId = "00001";
	double price = 5000;

	ofstream fout("test.csv", ios::app);
	fout << "合约代码:" << instId.c_str() << ",价格:" << price << endl;
	fout << "合约代码:" << instId.c_str() << ",价格:" << price + 50 << endl;

	fout.close();
	return 0;
}

redis5.0 知识点一

1、redis的重要配置项
2、stream数据类型
3、help子命令
4、更方便的搭建redis集群
5、新的Sorted Set命令
6、如何整理内存碎片和如何查看内存报告

======12项新特性======
1、新的Stream数据类型。
2、新的Redis模块API:Times and Cluster API。
3、RDB现在存储LFU和LRU信息。
4、集群管理器从Ruby(redis-trib.rb)移植到C代码。
5、新sorted set命令:ZPOPMIN/MAX和阻塞变种。
6、主动碎片整理V2。
7、增强HyperLogLog实现。
8、更好的内存统计报告。
9、许多带有子命令的命令现在都有一个HELP子命令。
10、客户经常连接和断开连接时性能更好。
11、错误修复和改进。
12、Jemalloc升级到5.1版。

======stream数据类型======
本质是一个抽象日志
redis现有String、List、Hash、Set、Sort Set、Stream 6种数据类型
1、其他5种数据结构类型不能显示的需求,可直接用stream实现。
2、直接贴近业务需求,提升开发效率。
3、物联网,各种传感器产生时间序列数据,定位未来。

用ChrootDirectory限制SFTP登录的用户只能访问指定目录且不能进行ssh登录

useradd -d /data/html/test1 -s /sbin/nologin test1 添加用户test1 不能ssh登录
passwd test1 // 修改用户密码
vim /etc/ssh/sshd_config
#Subsystem	sftp	/usr/libexec/openssh/sftp-server //将原先的注释掉

UseDNS no
AddressFamily inet
PermitRootLogin yes
SyslogFacility AUTHPRIV
PasswordAuthentication yes

Subsystem	sftp	internal-sftp
Match User test1
ForceCommand	internal-sftp
ChrootDirectory	/data/html/test1/
ChrootDirectory配置的主目录权限问题,需特别注意这两点:
1. ChrootDirectory所指向的文件夹,属主必须是root,属组是sftp用户所属的用户组。
2. ChrootDirectory所指向的文件夹到系统根路径上的所有途径文件夹,属主都必须是root,且权限不允许有群组用户写入权限,即权限只能为750或755,如果任意一个是777,则会出现连接失败的问题

chown root:test1 /data/html/test1
chown -R 777 /data/html/test1/child/ //必须在test1的目录下新增一个给test1权限的问题,不能就会出现只能读不能写
最后执行
systemctl restart sshd.service

如果出现错误,执行sshd -t 查看原因

/etc/bashrc 和 /etc/profile 和 .bash_profile 的区别是什么

/etc/profile
推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,缺点是可能会给系统带来安全性问题。 这里是针对所有的用户的,所有的shell;
/root/.bashrc
修改.bashrc文件,这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别,这里是针对某一个特定的用户,如果需要给某个用户权限
使用这些环境变量,只需要修改其个人用户主目录下的.bashrc文件就可以了。
1./etc/bashrc,用户目录下.bashrc有什么区别?  
一个是针对整个系统所有用户的,一个是针对特定用户的./etc/bashrc修改了以后要重启系统才生效,而用户目录下.bashrc修改了以后重新登录就生效  
2./etc/profile与/etc/bashrc的区别?  
前一个主要用来设置一些系统变量,比如JAVA_HOME等等,后面一个主要用来保存一些bash的设置.   
/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 
并从/etc/profile.d目录的配置文件中搜集shell的设置.  
/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.  
~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该  
文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.  
~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该  
该文件被读取.  
~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件.  
另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.  
~/.bash_profile 是交互式、login 方式进入 bash 运行的  
~/.bashrc 是交互式 non-login 方式进入 bash 运行的  
通常二者设置大致相同,所以通常前者会调用后者。  
.bash_profile 文件在通过控制台(或远程登录, 比如ssh)登录(login)系统的时候被执行的shell脚本.  
而 .bashrc 则是在打开虚拟终端的时候才会起作用,比如在GNOME,KDE中执行rxvt

lua 处理字符串分割

local function split(szFullString, szSeparator)
    local nFindStartIndex = 1
    local nSplitIndex = 1
    local nSplitArray = {}
    while true do
       local nFindLastIndex = string.find(szFullString, szSeparator, nFindStartIndex)
       if not nFindLastIndex then
        nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, string.len(szFullString))
        break
       end
       nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, nFindLastIndex - 1)
       nFindStartIndex = nFindLastIndex + string.len(szSeparator)
       nSplitIndex = nSplitIndex + 1
    end
    return nSplitArray
end