首页
关于
联系我
Search
1
华硕主板vga亮白灯
4,091 阅读
2
小米路由器4A千兆版(R4A) 关闭ipv6 防火墙
3,848 阅读
3
小米路由器4A千兆版(R4A)开启ssh
3,332 阅读
4
racknerd配置IPV6
2,463 阅读
5
z-library最新地址
2,069 阅读
未分类
各种资料
我的分析
技术活
游记
真相
笔记
经历
财务知识
资源类
软文
统计学
计划本
事件记录
反思
登录
Search
标签搜索
问题
linux
vps
debian
其他
测试
apt-get
库
wordpress
cdn
code
信息
设置
IP
nginx
应用
bae
centos6
debian7
proxy
Typecho
累计撰写
482
篇文章
累计收到
40
条评论
首页
栏目
未分类
各种资料
我的分析
技术活
游记
真相
笔记
经历
财务知识
资源类
软文
统计学
计划本
事件记录
反思
页面
关于
联系我
搜索到
6
篇与
的结果
2015-07-28
PHP 5.0~5.6 各版本兼容性的 cURL 文件上传
最近在搞一个针对sm.ms 图片站的上传插件,然后就遭遇curl 坑,也不知道是年龄大了,还是PHP 真的越来越麻烦了。转载一篇文章,作为备注吧最近做的一个需求,要通过PHP调用cURL,以multipart/form-data格式上传文件。踩坑若干,够一篇文章了。重要警告没事不要读PHP的官方中文文档!版本跟不上坑死你!不同版本PHP之间cURL的区别PHP的cURL支持通过给CURL_POSTFIELDS传递关联数组(而不是字符串)来生成multipart/form-data的POST请求。传统上,PHP的cURL支持通过在数组数据中,使用“@+文件全路径”的语法附加文件,供cURL读取上传。这与命令行直接调用cURL程序的语法是一致的:curl_setopt(ch, CURLOPT_POSTFIELDS, array( 'file' => '@'.realpath('image.png'), )); equals $ curl -F "file=@/absolute/path/to/image.png" <url> 但PHP从5.5开始引入了新的CURLFile类用来指向文件。CURLFile类也可以详细定义MIME类型、文件名等可能出现在multipart/form-data数据中的附加信息。PHP推荐使用CURLFile替代旧的@语法:curl_setopt(ch, CURLOPT_POSTFIELDS, [ 'file' => new CURLFile(realpath('image.png')), ]); PHP 5.5另外引入了CURL_SAFE_UPLOAD选项,可以强制PHP的cURL模块拒绝旧的@语法,仅接受CURLFile式的文件。5.5的默认值为false,5.6的默认值为true。但是坑的一点在于:@语法在5.5就已经被打了deprecated,在5.6中就直接被删除了(会产生 ErorException: The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead)。对于PHP 5.6+而言,手动设置CURL_SAFE_UPLOAD为false是毫无意义的。根本不是字面意义理解的“设置成false,就能开启旧的unsafe的方式”——旧的方式已经作为废弃语法彻底不存在了。PHP 5.6+ == CURLFile only,不要有任何的幻想。我的部署环境是5.4(仅@语法),但开发环境是5.6(仅CURLFile)。都没有压在5.5这个两者都支持过渡版本上,结果就是必须写出带有环境判断的两套代码。现在问题来了……(挖掘机滚远点!)环境判断:小心魔法数字!我见过这种环境判断的代码:if (version_compare(phpversion(), '5.4.0') >= 0) 我对这种代码的评价只有一个字:屎。这个判断掉入了典型的魔法数字陷阱。版本号莫名其妙的出现在代码之中,不查半天PHP手册和更新历史,很难明白作者被卡在了哪个功能的变更上。代码应该回归本源。我们的实际需求其实是:有CURLFile就优先采用,没有再退化到传统@语法。那么代码就来了:if (class_exists('\CURLFile')) { $field = array('fieldname' => new \CURLFile(realpath($filepath))); } else { $field = array('fieldname' => '@' . realpath($filepath)); } 建议明确指定的退化选项从可靠的角度,推荐指定CURL_SAFE_UPLOAD的值,明确告知php是容忍还是禁止旧的@语法。注意在低版本PHP中CURLOPT_SAFE_UPLOAD常量本身可能不存在,需要判断:if (class_exists('\CURLFile')) { curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true); } else { if (defined('CURLOPT_SAFE_UPLOAD')) { curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); } } cURL选项设置的顺序不管是curl_setopt()单发还是curl_setopt_array()批量,cURL的选项总是设置一个生效一个,而设置好的选项立刻就会影响cURL在设置后续选项时的行为。例如CURLOPT_SAFE_UPLOAD就和CURLOPT_POSTFIELDS的行为有关。如果先设置CURLOPT_POSTFIELDS再设置CURLOPT_SAFE_UPLOAD,那么后者的约束作用就不会生效。因为设置前者时cURL就已经把数据实际的识读处理完毕了!cURL有那么几个选项存在这种坑,务必小心。还好这种存在“依赖关系”的选项不多,机制也不复杂,简单处理即可。我的方法是先批量设置所有的选项,然后直到curl_exec()的前一刻才用curl_setopt()单发设置CURLOPT_POSTFIELDS。实际上在curl_setopt_array()用的数组中,保证CURLOPT_POSTFIELDS的位置在后边也是可靠的。PHP的关联数组是有顺序保障的,我们也可以假设curl_setopt_array()内部的执行顺序一定是从头到尾按顺序[注A],所以尽可放心。我的做法只是在代码表现上加个多余的保险,突出强调顺序的重要性防以后手贱。命名空间PHP 5.2或以下的版本没有命名空间。代码中用到了空间分隔符\就会引发解析器错误。要照顾PHP 5.2其实容易想,放弃命名空间即可。要注意的反倒是有命名空间的PHP 5.3+。无论是调用CURLFile还是用class_exists()判断CURLFile的存在性,都推荐写成\CURLFile明确指定顶层空间,防止代码包裹在命名空间内的时候崩掉。
2015年07月28日
339 阅读
0 评论
0 点赞
2015-06-29
商丘外地户口驾照到期,如何审
陪朋友去的,因为在网上没找到相关信息,所以自己写个给需要的人。先说情况:驾驶证到期,换证; 外地户口需要材料:旧驾驶证 ; 身份证 ;特别说下 暂住证 (目前的情况是不需要,我打听到的情况是:暂住证系统改居住证了,暂住证系统停止了,居住证系统没有开通。所以交警的处理办法是驾驶证转出,这样就不需要暂住证了。至于影响,办事员说没啥影响,甚至都没啥解释)办理地点:商丘南站行政服务中心一楼流程:先到排号机上打个号,别说我没提醒你,否则你可能要排好久队。然后出门左拐去旁边照相。(这点有点存疑,不清楚自己带照片去是否能办,按交警办事的尿性,推测可能不行) 这里要交费 10元然后进大厅右侧的服务点,复印身份证然后去大厅左侧体检,先交费20元。然后就是看色盲,看手脚(ps:这里呵呵下,完全是骗钱)然后去等待区,等待叫号。(这里会有好多空号,不知道是不是黄牛打的号)轮到你后,办理 。 大约1分钟后,会让你到对面的中原银行交费10元,拿着身份证去就是了。ok 完了。
2015年06月29日
364 阅读
0 评论
0 点赞
2015-06-02
新版Conoha利用API上传镜像安装系统
感谢hostloc “dzxx36gyy” 做出的贡献经过一番折腾,楼主我已经搞定了新版Conoha利用API上传ISO安装系统的方法了,当然, 大部分人还是会拿来安装windows(水晶党退散,迅雷这么坑还玩?)。 本教程主要利用如下API: 1.ISO上传API https://www.conoha.jp/docs/compute-iso-download-add.html 2.查看已上传的ISO的API https://www.conoha.jp/docs/compute-iso-list-show.html 3.挂载已上传的ISO的API https://www.conoha.jp/docs/compute-insert_iso_image.html 4.卸载ISO的API https://www.conoha.jp/docs/compute-eject_iso_image.html 5.身份验证API https://www.conoha.jp/docs/identity-post_tokens.html 6.VPS详细信息查看API https://www.conoha.jp/docs/compute-get_vms_detail_specified.html 首先,参照官方文档,我发现大部分操作并没有利用到Conoha面板API中的密码,而是用到了 X-Auth-Token,然后我找啊找,发现身份验证的API里面有一项可以生成这个。命令如下: curl -i -X POST \ -H "Accept: application/json" \ -d '{ "auth": { "passwordCredentials": { "username": "API用户名(店铺名称)", "password": "API用户密码(请自己在面板里添加)" }, "tenantId": "店铺ID" } }' \ https://identity.tyo1.conoha.io/v2.0/tokens 这是东京的API,其它地区的自己按照地址格式改。 运行之后会返回一串数据,请注意 { "access": { "token": { "issued_at": "2015-05-19T07:08:21.927295", "expires": "2015-05-20T07:08:21Z", "id": "sample00d88246078f2bexample788f7", 其余省略 这段中的id即为X-Auth-Token,上面那个expires是有效期,之后的操作均要用到X-Auth-Token。 现在我们可以开始上传ISO了,注意,由于官方API系统没建设完全,对http链接支持不完善,请 使用ftp格式的ISO地址(ISO必须带virtio驱动),上传命令如下: curl -i -X POST \ -H 'Content-Type: application/json' \ -H "Accept: application/json" \ -H "X-Auth-Token: (前面有个空格)这里是啥不用我说了吧" \ -d '{ "iso-image": { "url": "ftp格式的ISO地址" } }' \ https://compute.tyo1.conoha.io/v2/店铺ID/iso-images 同样,这个是东京的API地址,其它地区的 请按照格式自己修改 命令运行之后会返回数据,是ISO地址和你的API信息 之后我们应该查看ISO是否成功上传,命令如下 curl -i -X GET \ -H 'Content-Type: application/json' \ -H "Accept: application/json" \ -H "X-Auth-Token: (同样前面有个空格)" \ https://compute.tyo1.conoha.io/v2/店铺ID/iso-images 返回数据大概是这样的 { "iso-images": [ { "url": "ftp://ftp.riken.jp/Linux/centos/6.6/isos/x86_64/CentOS-6.6-x86_64-minimal.iso", "path": "/mnt/isos/repos/tenant_iso_data/43b36734a9e541fd91a62fc63ee93fed/CentOS-6.6-x86_64-minimal.iso", "ctime": "Fri Oct 24 23:22:57 2014", "name": "CentOS-6.6-x86_64-minimal.iso", "size": 401604608 }, { "url": "http://ftp.riken.jp/Linux/centos/7/isos/x86_64/CentOS-7.0-1406-x86_64-Everything.iso", "path": "/mnt/isos/repos/tenant_iso_data/43b36734a9e541fd91a62fc63ee93fed/CentOS-7.0-1406-x86_64-Everything.iso", "ctime": "Sat Jul 5 07:16:46 2014", "name": "CentOS-7.0-1406-x86_64-Everything.iso", "size": 7062159360 } ] } 出现在里面的代表成功上传了,挂载镜像会使用到path 挂载命令如下(前提条件:先创建vps,然后关机,在面板——服务器——VPS(别真以为有个选项叫vps啊)——vps设置——控制台键盘映射改为en-us curl -i -X POST \ -H "Accept: application/json" \ -H "X-Auth-Token: 不说了" \ -d '{"mountImage": "前面查看已上传的ISO里的path"}' \ https://compute.tyo1.conoha.io/v2/店铺ID/servers/VPS的UUID(点开vps管理,在VPS设置里和网址上有)/action 接下来要查看VPS详细信息,确认是否成功挂载 curl -i -X GET \ -H "Accept: application/json" \ -H "X-Auth-Token: 不说了" \ https://compute.tyo1.conoha.io/v2/店铺ID/servers/上一步里的UUID 返回信息里自己看吧,有你ISO的path就代表挂载成功了。 然后你开机吧(之前挂载步骤必须在关机状态下进行,不然会失败) 开启VNC,重启,会提示你按任意键以从光驱启动,之后不用我说了吧,唯一需要注意的一点就是 VPS设置里的那个控制台键盘映射必须换成en-us(电脑是日语键盘的请无视),不然各种灵异事件。 对了,安装完之后请卸载ISO,当然你不卸貌似也没问题,请在关机状态下运行 curl -i -X POST \ -H "Accept: application/json" \ -H "X-Auth-Token: 不说了" \ -d '{"unmountImage": ""}' \ https://compute.tyo1.conoha.io/v2/店铺ID/servers/VPS的UUID/action 返回信息没啥东西,无视吧。 好了,本教程END (别问我这些命令在什么里面运行……,随便找台联网的linux机子都行)
2015年06月02日
385 阅读
0 评论
0 点赞
2015-04-27
Debian 7升级Debian 8
Debian 8 在25号发布了,今天一上班就看到了,心里马上长草,速度把vps 升级下,呵呵… 还是拿hostodo 下手。先泼个凉水,免的看文章的网友更新完后悔,openvz 的vps 升级debian 是不能更新内核的,切记,切记。更新完内核还是可怜的“Linux te 2.6.32-042stab103.6”开始步骤,debian 的所有升级无非就是这样1、apt-get update这里先升级下debian7的软件,免的升级的过程中有兼容性问题2、apt-get upgrade 3、更换源为debian8更换下源,建议更换为官方源,官方源比较新,问题比较少,我的源是这样的deb http://ftp.us.debian.org/debian/ jessie main deb-src http://ftp.us.debian.org/debian/ jessie main deb http://security.debian.org/ jessie/updates main contrib deb-src http://security.debian.org/ jessie/updates main contrib # jessie-updates, previously known as 'volatile' deb http://ftp.us.debian.org/debian/ jessie-updates main contrib deb-src http://ftp.us.debian.org/debian/ jessie-updates main contrib4、apt-get update5、apt-get dist-upgrade这个过程就是升级了,升级过程中会让你选择,一路默认就可以了。okps:root@te:~# apt-get dist-upgrade正在读取软件包列表... 完成正在分析软件包的依赖关系树 正在读取状态信息... 完成 正在对升级进行计算... 失败下列软件包有未满足的依赖关系:udev : 破坏: plymouth (< 0.9.0-7) 但是 0.8.5.1-5 正要被安装E: 错误,pkgProblemResolver::Resolve 发生故障,这可能是有软件包被要求保持现状的缘故。 最后一步会出现这个错误,忽略吧,因为内核版本问题,忽略好了。 6、最后清理下apt-get autoremove 7 、检查下版本root@te:~# cat /etc/debian_version8.0已经成功升级8.0 ,只是内核还是可怜的2.6.32 ,也难怪openvz 卖的便宜,新内核你都用不上。
2015年04月27日
358 阅读
0 评论
0 点赞
2015-04-10
sar 系统性能监控
最近折腾刚买的hostodo ,发现个不错的系统性能检测工具sar ,debian 上安装的是 sysstat 。 顺便复制一点资料,做参考sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。sar命令常用格式sar [options] [-A] [-o file] t [n]其中:t为采样间隔,n为采样次数,默认值是1;-o file表示将命令结果以二进制格式存放在文件中,file 是文件名。options 为命令行选项,sar命令常用选项如下:-A:所有报告的总和-u:输出CPU使用情况的统计信息-v:输出inode、文件和其他内核表的统计信息-d:输出每一个块设备的活动信息-r:输出内存和交换空间的统计信息-b:显示I/O和传送速率的统计信息-a:文件读写情况-c:输出进程统计信息,每秒创建的进程数-R:输出内存页面的统计信息-y:终端设备活动情况-w:输出系统交换活动信息1. CPU资源监控例如,每10秒采样一次,连续采样3次,观察CPU 的使用情况,并将采样结果以二进制形式存入当前目录下的文件test中,需键入如下命令:sar -u -o test 10 3屏幕显示如下:17:06:16 CPU %user %nice %system %iowait %steal %idle17:06:26 all 0.00 0.00 0.20 0.00 0.00 99.8017:06:36 all 0.00 0.00 0.20 0.00 0.00 99.8017:06:46 all 0.00 0.00 0.10 0.00 0.00 99.90Average: all 0.00 0.00 0.17 0.00 0.00 99.83输出项说明:CPU:all 表示统计信息为所有 CPU 的平均值。%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。%nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。如果要查看二进制文件test中的内容,需键入如下sar命令:sar -u -f test 2. inode、文件和其他内核表监控例如,每10秒采样一次,连续采样3次,观察核心表的状态,需键入如下命令:sar -v 10 3屏幕显示如下:17:10:49 dentunusd file-nr inode-nr pty-nr17:10:59 6301 5664 12037 417:11:09 6301 5664 12037 417:11:19 6301 5664 12037 4Average: 6301 5664 12037 4输出项说明:dentunusd:目录高速缓存中未被使用的条目数量file-nr:文件句柄(file handle)的使用数量inode-nr:索引节点句柄(inode handle)的使用数量pty-nr:使用的pty数量3. 内存和交换空间监控例如,每10秒采样一次,连续采样3次,监控内存分页:sar -r 10 3输出项说明:kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间.kbmemused:这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间.%memused:这个值是kbmemused和内存总量(不包括swap)的一个百分比.kbbuffers和kbcached:这两个值就是free命令中的buffer和cache.4. 内存分页监控例如,每10秒采样一次,连续采样3次,监控内存分页:sar -B 10 3输出项说明:pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)majflt/s:每秒钟产生的主缺页数.pgfree/s:每秒被放入空闲队列中的页个数pgscank/s:每秒被kswapd扫描的页个数pgscand/s:每秒直接被扫描的页个数pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数%vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比5. I/O和传送速率监控例如,每10秒采样一次,连续采样3次,报告缓冲区的使用情况,需键入如下命令:sar -b 10 3屏幕显示如下:18:51:05 tps rtps wtps bread/s bwrtn/s18:51:15 0.00 0.00 0.00 0.00 0.0018:51:25 1.92 0.00 1.92 0.00 22.6518:51:35 0.00 0.00 0.00 0.00 0.00Average: 0.64 0.00 0.64 0.00 7.59输出项说明:tps:每秒钟物理设备的 I/O 传输总量rtps:每秒钟从物理设备读入的数据总量wtps:每秒钟向物理设备写入的数据总量bread/s:每秒钟从物理设备读入的数据量,单位为 块/sbwrtn/s:每秒钟向物理设备写入的数据量,单位为 块/s6. 进程队列长度和平均负载状态监控例如,每10秒采样一次,连续采样3次,监控进程队列长度和平均负载状态:sar -q 10 3屏幕显示如下:19:25:50 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-1519:26:00 0 259 0.00 0.00 0.0019:26:10 0 259 0.00 0.00 0.0019:26:20 0 259 0.00 0.00 0.00Average: 0 259 0.00 0.00 0.00输出项说明:runq-sz:运行队列的长度(等待运行的进程数)plist-sz:进程列表中进程(processes)和线程(threads)的数量ldavg-1:最后1分钟的系统平均负载(System load average)ldavg-5:过去5分钟的系统平均负载ldavg-15:过去15分钟的系统平均负载7. 系统交换活动信息监控例如,每10秒采样一次,连续采样3次,监控系统交换活动信息:sar - W 10 3屏幕显示如下:19:39:50 pswpin/s pswpout/s19:40:00 0.00 0.0019:40:10 0.00 0.0019:40:20 0.00 0.00Average: 0.00 0.00输出项说明:pswpin/s:每秒系统换入的交换页面(swap page)数量pswpout/s:每秒系统换出的交换页面(swap page)数量8. 设备使用情况监控例如,每10秒采样一次,连续采样3次,报告设备使用情况,需键入如下命令:# sar -d 10 3 –p屏幕显示如下:17:45:54 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util17:46:04 scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0017:46:04 sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0017:46:04 vg_livedvd-lv_root 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0017:46:04 vg_livedvd-lv_swap 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00其中:参数-p可以打印出sda,hdc等磁盘设备名称,如果不用参数-p,设备节点则有可能是dev8-0,dev22-0tps:每秒从物理磁盘I/O的次数.多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的.rd_sec/s:每秒读扇区的次数.wr_sec/s:每秒写扇区的次数.avgrq-sz:平均每次设备I/O操作的数据大小(扇区).avgqu-sz:磁盘请求队列的平均长度.await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒=1000毫秒).svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间.%util:I/O请求占CPU的百分比,比率越大,说明越饱和.1. avgqu-sz 的值较低时,设备的利用率较高。2. 当%util的值接近 1% 时,表示设备带宽已经占满。要判断系统瓶颈问题,有时需几个 sar 命令选项结合起来怀疑CPU存在瓶颈,可用 sar -u 和 sar -q 等来查看怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看怀疑I/O存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).%commit:这个值是kbcommit与内存总量(包括swap)的一个百分比.
2015年04月10日
391 阅读
0 评论
0 点赞
2014-05-12
河南商丘联通、石油、石化信息
虽然是公开信息,当时你真不一定能找到,所以分享出来。 单位名称:中国石油天然气股份有限公司河南商丘销售分公司GJZB 组织机构代码:70676271X 详细地址:商丘市商丘市睢阳区新城街道办事处新城街道办事处烟草小区 行政区划代码:411403004009 组织机构代码:769451046 单位详细名称:中国铁通集团有限公司商丘分公司 单位详细地址:商丘市睢阳区新城街道办事处神火大道79号 行政区划:411403004010 组织机构代码:716734712 单位详细名称:中国联通网络通信集团有限公司商丘市分公司 单位详细地址:商丘市睢阳区宋集镇宋集北街村委会 行政区划:411403100216 组织机构代码:721869742 单位详细名称:中国石油化工股份有限公司河南商丘分公司 详细地址:商丘市梁园区长征街道办事处四面钟四面钟西北角 行政区划代码:411402002004
2014年05月12日
305 阅读
0 评论
0 点赞