首页
关于
联系我
Search
1
小米路由器4A千兆版(R4A) 关闭ipv6 防火墙
89 阅读
2
小米路由器4A千兆版(R4A)开启ssh
82 阅读
3
win11不能访问共享0x800704f8
77 阅读
4
华硕主板vga亮白灯
39 阅读
5
racknerd配置IPV6
35 阅读
未分类
各种资料
我的分析
技术活
游记
真相
笔记
经历
财务知识
资源类
软文
统计学
计划本
事件记录
反思
登录
Search
标签搜索
问题
linux
vps
debian
测试
其他
apt-get
库
wordpress
cdn
code
设置
信息
IP
nginx
应用
推荐
搬家
操作
bae
Typecho
累计撰写
493
篇文章
累计收到
0
条评论
首页
栏目
未分类
各种资料
我的分析
技术活
游记
真相
笔记
经历
财务知识
资源类
软文
统计学
计划本
事件记录
反思
页面
关于
联系我
搜索到
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日
2 阅读
0 评论
0 点赞
2015-06-29
商丘外地户口驾照到期,如何审
陪朋友去的,因为在网上没找到相关信息,所以自己写个给需要的人。先说情况:驾驶证到期,换证; 外地户口需要材料:旧驾驶证 ; 身份证 ;特别说下 暂住证 (目前的情况是不需要,我打听到的情况是:暂住证系统改居住证了,暂住证系统停止了,居住证系统没有开通。所以交警的处理办法是驾驶证转出,这样就不需要暂住证了。至于影响,办事员说没啥影响,甚至都没啥解释)办理地点:商丘南站行政服务中心一楼流程:先到排号机上打个号,别说我没提醒你,否则你可能要排好久队。然后出门左拐去旁边照相。(这点有点存疑,不清楚自己带照片去是否能办,按交警办事的尿性,推测可能不行) 这里要交费 10元然后进大厅右侧的服务点,复印身份证然后去大厅左侧体检,先交费20元。然后就是看色盲,看手脚(ps:这里呵呵下,完全是骗钱)然后去等待区,等待叫号。(这里会有好多空号,不知道是不是黄牛打的号)轮到你后,办理 。 大约1分钟后,会让你到对面的中原银行交费10元,拿着身份证去就是了。ok 完了。
2015年06月29日
8 阅读
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日
9 阅读
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日
8 阅读
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日
11 阅读
0 评论
0 点赞
2014-05-12
河南商丘联通、石油、石化信息
虽然是公开信息,当时你真不一定能找到,所以分享出来。 单位名称:中国石油天然气股份有限公司河南商丘销售分公司GJZB 组织机构代码:70676271X 详细地址:商丘市商丘市睢阳区新城街道办事处新城街道办事处烟草小区 行政区划代码:411403004009 组织机构代码:769451046 单位详细名称:中国铁通集团有限公司商丘分公司 单位详细地址:商丘市睢阳区新城街道办事处神火大道79号 行政区划:411403004010 组织机构代码:716734712 单位详细名称:中国联通网络通信集团有限公司商丘市分公司 单位详细地址:商丘市睢阳区宋集镇宋集北街村委会 行政区划:411403100216 组织机构代码:721869742 单位详细名称:中国石油化工股份有限公司河南商丘分公司 详细地址:商丘市梁园区长征街道办事处四面钟四面钟西北角 行政区划代码:411402002004
2014年05月12日
9 阅读
0 评论
0 点赞