众所周知,用curl上传只要设置4个变量即可(非HTTPS网站),那就是curlopt_url,curlopt_post,curlopt_returntransfer,curlopt_postfields,当然这4个都是大写。
curlopt_post,curlopt_returntransfer 都是 true,curlopt_url则是你要提交的网址,那么剩下的,curlopt_postfields就是你要上传的内容了。
上传文件在这里也变得非常简单,只需对应的值前面加个“@”即可,如curl_setopt($ch,CURLOPT_POSTFIELDS,array('file'=>'@/var/www/images/abc.jpg')); 文件通过realpath判断后存在的即可。
但是,这一切在php5.6里就发生了改成。php5.6不再支持@这样的上传方式,只能使用curl_file_create的方式来,所以上面的代码要改成
PHP代码
    - curl_setopt($ch,CURLOPT_POSTFIELDS,array('file'=>curl_file_create('/var/www/images/abc.jpg','image/jpg','abc')));   
 
 
 
看看文档里怎么说:
XML/HTML代码
    - CURLFile should be used to upload a file with CURLOPT_POSTFIELDS.  
 
 
然后官网的手册中的最后一条评论,仿佛是看不下去,写了个处理上传的程序
PHP代码
    - There are "@" issue on multipart POST requests.  
 
    -   
 
    - Solution for PHP 5.5 or later:  
 
    - - Enable CURLOPT_SAFE_UPLOAD.  
 
    - - Use CURLFile instead of "@".  
 
    -   
 
    - Solution for PHP 5.4 or earlier:  
 
    - - Build up multipart content body by youself.  
 
    - - Change "Content-Type" header by yourself.  
 
    -   
 
    - The following snippet will help you :D  
 
    -   
 
    - <?php  
 
    -   
 
    -  
 
    -  
 
    -  
 
    -  
 
    -  
 
    -  
 
    -  
 
    -   
 
    - function curl_custom_postfields($ch, array $assoc = array(), array $files = array()) {  
 
    -       
 
    -       
 
    -     static $disallow = array("\0", "\"", "\r", "\n");  
 
    -       
 
    -       
 
    -     foreach ($assoc as $k => $v) {  
 
    -         $k = str_replace($disallow, "_", $k);  
 
    -         $body[] = implode("\r\n", array(  
 
    -             "Content-Disposition: form-data; name=\"{$k}\"",  
 
    -             "",  
 
    -             filter_var($v),   
 
    -         ));  
 
    -     }  
 
    -       
 
    -       
 
    -     foreach ($files as $k => $v) {  
 
    -         switch (true) {  
 
    -             case false === $v = realpath(filter_var($v)):  
 
    -             case !is_file($v):  
 
    -             case !is_readable($v):  
 
    -                 continue;   
 
    -         }  
 
    -         $data = file_get_contents($v);  
 
    -         $v = call_user_func("end", explode(DIRECTORY_SEPARATOR, $v));  
 
    -         $k = str_replace($disallow, "_", $k);  
 
    -         $v = str_replace($disallow, "_", $v);  
 
    -         $body[] = implode("\r\n", array(  
 
    -             "Content-Disposition: form-data; name=\"{$k}\"; filename=\"{$v}\"",  
 
    -             "Content-Type: application/octet-stream",  
 
    -             "",  
 
    -             $data,   
 
    -         ));  
 
    -     }  
 
    -       
 
    -       
 
    -     do {  
 
    -         $boundary = "---------------------" . md5(mt_rand() . microtime());  
 
    -     } while (preg_grep("/{$boundary}/", $body));  
 
    -       
 
    -       
 
    -     array_walk($body, function (&$part) use ($boundary) {  
 
    -         $part = "--{$boundary}\r\n{$part}";  
 
    -     });  
 
    -       
 
    -       
 
    -     $body[] = "--{$boundary}--";  
 
    -     $body[] = "";  
 
    -       
 
    -       
 
    -     return @curl_setopt_array($ch, array(  
 
    -         CURLOPT_POST       => true,  
 
    -         CURLOPT_POSTFIELDS => implode("\r\n", $body),  
 
    -         CURLOPT_HTTPHEADER => array(  
 
    -             "Expect: 100-continue",  
 
    -             "Content-Type: multipart/form-data; boundary={$boundary}",   
 
    -         ),  
 
    -     ));  
 
    - }  
 
 
好吧,其实多文件上传用这样的方式就挺好。
 
现在写PHP好象不用Composer总感觉有点Low了吧?好吧,即使这样,你在使用composer update的时候是不是也发现网速、进度low的不行。一个composer update要等半天。不说这个吧,你就是一个composer init也要等半天,这只是个空项目,你都要等这么久?composer 如果不加-vvv参数,你就感觉整个世界都停在那里了。所以,如果连接原始的composer还是加个-vvv参数吧
国内常见镜像有三个:
XML/HTML代码
    - http://pkg.phpcomposer.com/  
 
    - https://toran.reimu.io/  
 
    - http://packagist.cn/  
 
 
 
使用方法很简单一种是在~/.composer/config.json中加入相应的信息,一种是在当前项目的composer.json中加入:
JavaScript代码
    - "repositories": [  
 
    -     {"type": "composer", "url": "http://pkg.phpcomposer.com/repo/packagist/"},  
 
    -     {"packagist": false}  
 
    - ]  
 
 
 
加入的时候注意语法,如果是json的最后一个元素,记得不要加","即可,否则 会报错
OK这样就可以了,尽情的尝试吧(packagist.cn更新的有点慢,toran.reimu.io 是https的,如果你本机openssl版本低可能会更新失败)。好象话这么一说,只能用pkg.phpcomposer.com的源了(嗯,忍忍吧,如果他不能用,你再换)
更新:composer 源 
 
 
 
鉴于机器有点慢,所以决定 将光驱换成SSD。并将系统移到了SSD上,然后让人纠结的事情就发生了。如果不动机器纯待机,一天一夜20%的电,去年国庆的时候,将mac带回来。5天没动。回上海后发现居然自动关机了~~~
那时候就在想为什么会这么耗电,想来想去可能是因为待机的时候SSD供电无法关闭(看资料是说mac在待机的时候,会将部分设备的电源关闭的,比如光驱,现在我的系统在光驱位上,那一定断不了电)
但一直没时间折腾它,前段时间终于想到了,还是折腾一下吧。于是将SSD硬盘换到主硬盘位,原来的硬盘放到了光区位。周五下班后,电脑就一直没开。周一早上开,还有91%的电。感觉省下了不少啊~~(rmbp的时候2天只有2%的电,我忍了~)
-----------
顺便问问如果有人有兴趣,我想出掉现在的这台电脑以及一台mac air
1、Macbook Air 11寸 港版,8G内存定制版,硬盘SSD 128G 。实际使用不满100小时, 5000 出(不含快递费)去年6月买的,应该是13款,14款是快年底才有的
2、Macbook Pro 13 ,2012款年中版,i5 CPU,原4G内存升到16G,原500G硬盘升级成(SSD+500)【SSD是Intel 250G的,买的时候京东价1300,现价1100,http://item.jd.com/1011784.html】,6000出 这个就是我现在在用的
 
鉴于我每次安装win7都是在用bootcamp的情况下,随之而来带来的问题就是,只有一个分区,这让我很苦恼。所以到最后我往往都是直接用虚拟机算了。
本文来自CU,本人目前没有测试过,先备着,万一哪天我又心血来潮了,我就用它来试一下(原文来自:http://bbs.chinaunix.net/thread-4166135-1-1.html)
本帖最后由 xinyv 于 2015-01-12 12:15 编辑
 
 
2015年元旦macbook air 安装记录
目的:
    1、air 安装双系统 Yosemite + win7
    2、win7 多分区
    3、单U盘安装
准备:
    16G U盘一个usb3.0
制作安装U盘:
1、下载最新的 MacOS Yosemite 10.10.1, win7sp1
    下载yosemite必须用 mac app store 下载,我下载的版本
    yosemite 10.10.1 md5:e37ac9e9c79de428529c6933419ee5ff
    win7sp1_x64.iso  md5:480b62c3acd6c8a36b18d9e906cd90d2
2、制作 win7 安装盘
    打开 Launchpad -> 其他 -> Boot Camp 助理,点击继续,选择创建 Windows 7 或更高版本的安装盘 和 从 Apple下载最新的Windows 支持软件,点击继续,选取你的 win7 的iso镜像,然后点继续,速度快慢就看你的网速是否给力了。
    制作完之后,找另一个 windows 系统,插上 U盘,在硬盘上新建一个文件夹,把U盘里面所有的文件都拷贝进去,这时候,你可以用U盘引导一下air 试试,(插入U盘,启动的时候按 option,选择WININSTALL)你会发现键盘鼠标都不能用,查资料是因为新款air使用了usb3.0  win7默认没有驱动
    安装驱动,参考链接 http://bbs.feng.com/read-htm-tid-8541291.html
安装驱动其实就是编辑 boot.win 和 install.win 这两个文件
创建二个文件夹m1、m2 用来 mount上面的两个文件 (cmd  命令)
然后从刚才的备份中挂载 boot.win 和 install.win 我备份的目录是 D:\uu
XML/HTML代码
    - dism /mount-wim /wimfile:d:\uu\source\boot.wim /index:2 /mountdir:m1  
 
    - dism /mount-wim /wimfile:d:\uu\sources\install.wim /index:4 /mountdir:m2  
 
 
添加usb3.0驱动
XML/HTML代码
    - dism /image:m1 /add-driver /driver:d:\uu\$WinPEDriver$\IntelxHCISetup\Drivers\xHCI\Win7\x64\iusb3hub.inf  
 
    -   
 
    - dism /image:m2 /add-driver /driver:d:\uu\$WinPEDriver$\IntelxHCISetup\Drivers\xHCI\Win7\x64\iusb3hub.inf  
 
    -   
 
    - dism /image:m1 /add-driver /driver:d:\uu\$WinPEDriver$\IntelxHCISetup\Drivers\xHCI\Win7\x64\iusb3xhc.inf  
 
    -   
 
    - dism /image:m2 /add-driver /driver:d:\uu\$WinPEDriver$\IntelxHCISetup\Drivers\xHCI\Win7\x64\iusb3xhc.inf  
 
    -   
 
    - dism /image:m1 /add-driver /driver:d:\uu\$WinPEDriver$\IntelxHCISetup\Drivers\HCSwitch\Win7\x64\iusb3hcs.inf  
 
    -   
 
    - dism /image:m2 /add-driver /driver:d:\uu\$WinPEDriver$\IntelxHCISetup\Drivers\HCSwitch\Win7\x64\iusb3hcs.inf  
 
 
提交修改,umount 文件
XML/HTML代码
    - dism /unmount-wim /mountdir:m1 /commit  
 
    - dism /unmount-wim /mountdir:m2 /commit  
 
    - rmdir m1 m2  
 
 
把 U 盘卸载,重新插到 air 上面
3、制作 air 安装U盘
    打开 Launchpad -> 其他 -> 磁盘工具,把U盘的信息全部抹掉,包括默认分区也要删除,然后重新创建U盘分区,创建的时候选择主引导记录,分两个区,第一个是 win_setup文件系统类型选 exfat,第二个选 MacOS 日志文件系统,第一个一定要是 windows 分区
参考链接:http://bbs.feng.com/read-htm-tid-2628649.html
 
    以前直接用下载的 dmg 制作就可以,新版系统的制作方式已经变化了
    打开Finder-应用程序,找到安装OS X Yosemite,右键-显示包内容,依次点开Contents-SharedSupport文件夹,你会发现一个InstallESD的DMG文件,双击打开这个文件,你会看到一个文件夹 Packages 
    下面打开终端输入
XML/HTML代码
    - defaults write com.apple.finder AppleShowAllFile -bool true  
 
    - killall Finder  
 
 
如果这条命令提示错误,你可以把后面的 -bool true 改成 YES,实在不行就 man 一下
    执行成功以后在看看刚才那个文件夹,多出了几个隐藏文件 BaseSystem.dmg
    打开 Launchpad -> 其他 -> 磁盘工具,选择 u 盘,选恢复
    把左侧的 u 盘拖到目标盘那里,把刚才我们看到的隐藏文件 BaseSystem.dmg 拖到源磁盘那里,然后点恢复。恢复完成以后,把 BaseSystem.dmg 和 BaseSystem.chunklist 拷贝到 u 盘苹果系统分区的根目录里面,然后进入 System\Installation 删除 Packages 这个链接,把 InstallESD 下面的 Packages 文件夹拷贝到这里来。拷贝 BaseSystem 哪两个文件不能省略,省略之后引导系统的时候会提示  undefined error 0 
    把系统文件在恢复隐藏
XML/HTML代码
    - defaults write com.apple.finder AppleShowAllFile -bool false  
 
    - killall Finder  
 
 
到此 Yosemite 的安装盘制作完成,我发现在 air 上按照上面的方法制作都可以成功,但在 pro 上制作安装盘失败。原因还没有找到
    参考链接:http://mac-how-to.wonderhowto.co ... 0-yosemite-0155306/
 
4、多系统安装盘制作
    把刚才制做好的 U盘插到刚才我们备份的 win系统上,利用 Windows7-USB-DVD-Download-Tool 工具和 win7 iso 创建一个win 安装 U盘,使用第一个我们预留的分区,制作完成以后,拷贝刚才我们备份的 uu 下的所有文件,直接覆盖进 u盘的 win 分区。拷贝完数据,安装盘就制作完成了。下面就是安装系统了。
 
5、安装系统
    因最前面有一个 200M 的 efi 分区,最后又有一个 Recovery 分区,在加上苹果系统自己占用的一个分区,win7 就只剩下一个分区了,网上说的总总办法,比如删除 Recovery,扩展那个 efi 分区,在10.10.1 上测试均有问题,不是 mac 系统找不到就是 win7 起不来,经多多次测试,发现一个折中的方案
    在重装系统的时候,直接提前分区,我分了 三个区,
        第一区 WinOS
        第二区 data
        第三区 MacOS
    这么分区的原因是 win7 会在最前面放一个 200 M的 efi,MacOS 会在最后面放一个 Recovery,这样前后都有系统分区把数据分区和功能分区隔离开,不容易损坏,分区之后用U盘引导,先安装 Yosemite,安装在最后一个分区,安装完以后在重新引导安装 win7,这时候你会发现 Recovery 被挤出了主分区表,Win7 看到的是未分配空间,不用搭理他,反正不是给你win7 用的,不认识就不认识吧,然后安装win7,安装 boot camp。安装好以后你会发现虽然 win7不认识,然这并不影响mac系统,启动的时候按 option ,你就会发现Recovery 仍旧是可以使用的,而且因为他被挤出去的原因,我们现在又多了一个分区名额,你可以增加一个扩展分区,然后在分若干个盘了。
 
至此,air就安装完了,我们保留了所有默认分区,而且 win7 支持多分区,单U盘安装双系统,多分区目的完成
 
 
 最近在大卫的指点下开始摸Java了。但我其实更擅长的是PHP,所以现在就开始混用了,那混用的最佳搭配是resin(其实apache+resin插件也OK)。不过纯resin的话也就意味着可以直接混用java的数据了。而不是采用接口调用的方式。
在mac下安装resin是有点麻烦的,官方的教程就几句话,参考 :http://www.caucho.com/resin-4.0/admin/starting-resin-install.xtp,
XML/HTML代码
    - Next we'll change into the Resin directory we just unpacked to configure and build the server. The Java portions of Resin are already compiled, but this step will build additional C-based components of Resin that provide additional functionality such as:  
 
    -   
 
    - A faster IO library, including massive keepalive support *  
 
    - Support for OpenSSL *  
 
    - The ability to run as a non-priviledged user for security  
 
    - Connector modules for Apache  
 
    - (* only available in Resin Professional)  
 
 
然后官方的文档就提示你,configure一下就OK了。不过解开压缩包发现,configure没有可执行权限,只能先chmod +x ./configure。
我第一次是按照官方的例子来的,即:
XML/HTML代码
    - ./configure --prefix=/usr/local/share/resin \  
 
    -             --with-resin-root=/var/resin \  
 
    -             --with-resin-log=/var/log/resin \  
 
    -             --with-resin-conf=/etc/resin  
 
 
但后面在运行的时候,一会提示log文件写不了,一会提示app目录不能创建,虽然chown改了权限 后就OK了,但总是有点小问题。去网上找了一下,发现了:http://www.cnblogs.com/jmtbai/p/4394424.html,它在内容里就有说:
XML/HTML代码
    - ./configure -prefix=/Users/emma/Documents/workspace/resin-pro-4.0.43 -enable-64bit-jni  
 
    -   
 
    - /Users/emma/Documents/workspace/resin-pro-4.0.43为最终resin被安装的目录,这个目录需要指定,不然默认就是/var/share/resin下,这个读resin.xml文件时会有问题  
 
 
果然我把prefix改成我的路径就OK了。(上面的-prefix是不对的,是--prefix)。
顺利的将项目运行了起来,同时写了个test.php,居然也OK了。(现在是知其然不知其所以然,先用起来再说了)