首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
182 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
28
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
100
篇与
的结果
2023-08-09
PHP & HTML5 文件夹上传
PHP & HTML5 文件夹上传拖拽上传文件夹到一个web应用程序。所以上传多个文件是一个有趣的了不起的进步。但是现在我提供给你 webkitdirectory !注意:这只会在一个最新的webkit的浏览器上运行。webkitdirectory目前不是标准 ,纯粹是为了玩。我不建议你在正式环境部署这个应用程序。I had the pleasure of having a little play around with this when I should have probablybeen working with processing for university but I do like to procrastinate。(此略)所以,干脆痛快:html 代码会员.jpg很简单,对吗?确实啊!上PHP代码。PHP 代码if($_FILES['file_input']){$uploads = UpFilesTOObj($_FILES['file_input']); $fileUploader=new FileUploader($uploads);}class FileUploader{public function __construct($uploads,$uploadDir='uploads/'){ foreach($uploads as $current) { $this->uploadFile=$uploadDir.$current->name.".".get_file_extension($current->name); if($this->upload($current,$this->uploadFile)){ echo "Successfully uploaded ".$current->name."n"; } } } public function upload($current,$uploadFile){ if(move_uploaded_file($current->tmp_name,$uploadFile)){ return true; } }}function UpFilesTOObj($fileArr){foreach($fileArr['name'] as $keyee => $info) { $uploads[$keyee]->name=$fileArr['name'][$keyee]; $uploads[$keyee]->type=$fileArr['type'][$keyee]; $uploads[$keyee]->tmp_name=$fileArr['tmp_name'][$keyee]; $uploads[$keyee]->error=$fileArr['error'][$keyee]; } return $uploads;}function get_file_extension($file_name){ return substr(strrchr($file_name,'.'),1);}我也一直在准备做MooTools脚本异步上传文件。所以请继续关注。我很高兴听到任何意见或建议。好运。更新:上传时保持目录结构 :所以最近我一直在玩很多新的文件API和一些图像处理等。在javascript中,我有巨大的乐趣这样做!我已经看到很多人问文件夹上传,这是一个令人兴奋的新发展。大多数人似乎有上传文件夹时保留文件结构的问题。在上传时是有可能保持文件夹的结构的。在写作时,我一直无法找到一个等价的不使用webkit的浏览器。这篇文章仅供测试!我正在写一个完整的AJAX文件夹上传脚本,但是我做时,我会去发一些我发现有趣的小代码片段。因此,闲话少说,上代码:未选择任何文件document.getElementById('files').onchange = function(e) { var files = e.target.files; // FileList for (var i = 0, f; f = files[i]; ++i)console.debug(files[i].webkitRelativePath);}检索路径是这么简单!这是一个工作示例:这是最基本的版本,将显示已提交的列表。fiddle是更复杂的比上面的代码让它不显示控制台什么的 。上传到服务器!事情开始变得稍微复杂,当我们上传这些到服务器时。我已经能够找到在撰写本文时,HTTP请求不支持上传时的变换文件路径。这可以很容易地通过我们自己添加它到请求数据解决。function uploadFiles(files){// Create a new HTTP requests, Form data item (data we will send to the server) and an empty string for the file paths. xhr = new XMLHttpRequest(); data = new FormData(); paths = ""; // Set how to handle the response text from the server xhr.onreadystatechange = function(ev){ console.debug(xhr.responseText); }; // Loop through the file list for (var i in files){ // Append the current file path to the paths variable (delimited by tripple hash signs - ###) paths += files[i].webkitRelativePath+"###"; // Append current file to our FormData with the index of i data.append(i, files[i]); }; // Append the paths variable to our FormData to be sent to the server // Currently, As far as I know, HTTP requests do not natively carry the path data // So we must add it to the request manually. data.append('paths', paths); // Open and send HHTP requests to upload.php xhr.open('POST', "upload.php", true); xhr.send(this.data);}This will simply create a triple hash delimited string which we will split into an array of file paths on the server which will correspond to our array of files。这将创建一个三重散列分隔的字符串,我们将分成数组服务器上的文件路径将对应于我们的一系列文件。0)$fileUploader = new FileUploader($_FILES); class FileUploader{public function __construct($uploads,$uploadDir='uploads/'){ // Split the string containing the list of file paths into an array $paths = explode("###",rtrim($_POST['paths'],"###")); // Loop through files sent foreach($uploads as $key => $current) { // Stores full destination path of file on server $this->uploadFile=$uploadDir.rtrim($paths[$key],"/."); // Stores containing folder path to check if dir later $this->folder = substr($this->uploadFile,0,strrpos($this->uploadFile,"/")); // Check whether the current entity is an actual file or a folder (With a . for a name) if(strlen($current['name'])!=1) // Upload current file if($this->upload($current,$this->uploadFile)) echo "The file ".$paths[$key]." has been uploadedn"; else echo "Error"; } } private function upload($current,$uploadFile){ // Checks whether the current file's containing folder exists, if not, it will create it. if(!is_dir($this->folder)){ mkdir($this->folder,0700,true); } // Moves current file to upload destination if(move_uploaded_file($current['tmp_name'],$uploadFile)) return true; else return false; }}?>进展这绝不是完美的,这是我一直在玩,并分享我的发现。我将会更新这篇文章当我有更多要发的东西。或者如果有特别令人兴奋的东西,我甚至可能发一篇新文章。所以现在,到这里下载源码 Folder-Upload-Structure-Sapphiondotcom
2023年08月09日
12 阅读
0 评论
0 点赞
2023-08-09
编程指南
第 1 部分:降低复杂性(算法级别摆脱复杂性)第 2 部分:摆脱空值(代码中的问题)第 3 部分:对象的生与死(对象生命周期以及如何正确封装它们)第 4 部分:消息(对象通信)
2023年08月09日
13 阅读
0 评论
0 点赞
2023-08-09
5天学会一种 web 开发框架
5天学会一种 web 开发框架eb framework层出不穷,特别是ruby/python,各有10+个,php/java也是一大堆 根据我自己的经验写了一个to do list,按照这个清单,一条一条的学习,事半功倍,很快就能掌握 一共25条,即便很磨蹭,2小时也能搞定一条,25*2=50。只需要50小时就能掌握任意一种web框架各类web框架大同小异:现代web开发框架的6大元素,把握主线,就不会迷路建议把本文打印到一张A4纸,搞定一条打个勾web框架学习列表如何定义 url route如何组织 request handler 函数写一个最简单的request handler 函数如何从get/post请求中取出参数如何定义全局url 拦截函数如何获取/修改/存储 cookie,session数据如何修改/输出 http header 数据如何部部署app 程序服务器部署可以参考读python web 程序的9种部署方式如何配置开发环境如何配置静态文件访问如何访问数据库是否支持ORM支持orm如何维护表结构的变更如何定义/组织/初始化 数据表如何对接orm系统和现有的表结构掌握最基本的add/delete/按字段查询/count/slice/order by如何直接使用sql 访问数据库不支持orm (这样的web框架,不用也罢)如何使用模板系统如何组织/访问 模板文件的目录结构如何在模板中嵌入代码模板是否支持继承结构模板之间如何include如何自定义模板函数如何通过http get/post 获取远程数据如何parse json如何parse xml如何输出为 json如何处理状态码:404和50x如何处理文件上传可选的学习项目发送emaillog图片处理误区表单验证辅助函数,很多框架的表单验证部分实现的特别复杂,初学者完全不需要,手写代码处理就够用ORM中的hasone,manytomany,onetomany关系,概念很复杂,其实只是多写/少写一个查询字段的关系,学习成本太高,初学者完全不需要理会,直接跳过
2023年08月09日
16 阅读
0 评论
0 点赞
2023-08-09
PHP编程中的锁
PHP编程中的锁最近看了《理解Linux进程》这本开源书,链接。该书描述了linux中的进程概念,对锁和进程间通信(IPC)有一些总结。不过该书的描述语言是golang, 平时用的比较少,就想对应概念找找php中的接口。文件锁全名叫 advisory file lock, 书中有提及。 这类锁比较常见,例如 mysql, php-fpm 启动之后都会有一个pid文件记录了进程id,这个文件就是文件锁。这个锁可以防止重复运行一个进程,例如在使用crontab时,限定每一分钟执行一个任务,但这个进程运行时间可能超过一分钟,如果不用进程锁解决冲突的话两个进程一起执行就会有问题。使用PID文件锁还有一个好处,方便进程向自己发停止或者重启信号。例如重启php-fpm的命令为kill -USR2 cat /usr/local/php/var/run/php-fpm.pid发送USR2信号给pid文件记录的进程,信号属于进程通信,会另开一个篇幅。php的接口为flock,文档比较详细。先看一下定义,bool flock ( resource $handle , int $operation [, int &$wouldblock ] ).$handle是文件系统指针,是典型地由 fopen() 创建的 resource(资源)。这就意味着使用flock必须打开一个文件。$operation 是操作类型。&$wouldblock 如果锁是阻塞的,那么这个变量会设为1.需要注意的是,这个函数默认是阻塞的,如果想非阻塞可以在 operation 加一个 bitmask LOCK_NB. 接下来测试一下。$pid_file = "/tmp/process.pid";$pid = posix_getpid();$fp = fopen($pid_file, 'w+');if(flock($fp, LOCK_EX | LOCK_NB)){echo "got the lock \n"; ftruncate($fp, 0); // truncate file fwrite($fp, $pid); fflush($fp); // flush output before releasing the lock sleep(300); // long running process flock($fp, LOCK_UN); // 释放锁定} else {echo "Cannot get pid lock. The process is already up \n";}fclose($fp);保存为 process.php,运行php process.php &, 此时再次运行php process.php,就可以看到错误提示。flock也有共享锁,LOCK_SH.互斥锁和读写锁sync模块中的MutexMutex是一个组合词,mutual exclusion。用pecl安装一下sync模块, pecl install sync。 文档中的SyncMutex只有两个方法,lock 和 unlock, 我们就直接上代码测试吧。没有用IDE写,所以cs异常丑陋,请无视。$mutex = new SyncMutex("UniqueName");for($i=0; $i<2; $i++){$pid = pcntl_fork(); if($pid <0){ die("fork failed"); }elseif ($pid>0){ echo "parent process \n"; }else{ echo "child process {$i} is born. \n"; obtainLock($mutex, $i); }}while (pcntl_waitpid(0, $status) != -1) {$status = pcntl_wexitstatus($status); echo "Child $status completed\n"; }function obtainLock ($mutex, $i){echo "process {$i} is getting the mutex \n"; $res = $mutex->lock(200); sleep(1); if (!$res){ echo "process {$i} unable to lock mutex. \n"; }else{ echo "process {$i} successfully got the mutex \n"; $mutex->unlock(); } exit();}保存为mutex.php, run php mutex.php, output isparent process parent process child process 1 is born. process 1 is getting the mutex child process 0 is born. process 0 is getting the mutex process 1 successfully got the mutex Child 0 completedprocess 0 unable to lock mutex. Child 0 completed这里子进程0和1不一定谁在前面。但是总有一个得不到锁。这里SyncMutex::lock(int $millisecond)的参数是 millisecond, 代表阻塞的时长, -1 为无限阻塞。sync模块中的读写锁SyncReaderWriter的方法类似,readlock, readunlock, writelock, writeunlock,成对出现即可,没有写测试代码,应该和Mutex的代码一致,把锁替换一下就可以。sync模块中的Event感觉和golang中的Cond比较像,wait()阻塞,fire()唤醒Event阻塞的一个进程。有一篇好文介绍了Cond, 可以看出Cond就是锁的一种固定用法。SyncEvent也一样。php文档中的例子显示,fire()方法貌似可以用在web应用中。上测试代码for($i=0; $i<3; $i++){$pid = pcntl_fork(); if($pid <0){ die("fork failed"); }elseif ($pid>0){ //echo "parent process \n"; }else{ echo "child process {$i} is born. \n"; switch ($i) { case 0: wait(); break; case 1: wait(); break; case 2: sleep(1); fire(); break; } }}while (pcntl_waitpid(0, $status) != -1) {$status = pcntl_wexitstatus($status); echo "Child $status completed\n"; }function wait(){$event = new SyncEvent("UniqueName"); echo "before waiting. \n"; $event->wait(); echo "after waiting. \n"; exit();}function fire(){$event = new SyncEvent("UniqueName"); $event->fire(); exit();}这里故意少写一个fire(), 所以程序会阻塞,证明了 fire() 一次只唤醒一个进程。pthreads模块貌似也看到了Mutex, Cond, Pool. 没来得及看,看完再补充。信号量sync模块中的信号量SyncSemaphore文档中显示,它和Mutex的不同之处,在于Semaphore一次可以被多个进程(或线程)得到,而Mutex一次只能被一个得到。所以在SyncSemaphore的构造函数中,有一个参数指定信号量可以被多少进程得到。public SyncSemaphore::__construct ([ string $name [, integer $initialval [, bool $autounlock ]]] ) 就是这个$initialval (initial value)$lock = new SyncSemaphore("UniqueName", 2);for($i=0; $i<2; $i++){$pid = pcntl_fork(); if($pid <0){ die("fork failed"); }elseif ($pid>0){ echo "parent process \n"; }else{ echo "child process {$i} is born. \n"; obtainLock($lock, $i); }}while (pcntl_waitpid(0, $status) != -1) {$status = pcntl_wexitstatus($status); echo "Child $status completed\n"; }function obtainLock ($lock, $i){echo "process {$i} is getting the lock \n"; $res = $lock->lock(200); sleep(1); if (!$res){ echo "process {$i} unable to lock lock. \n"; }else{ echo "process {$i} successfully got the lock \n"; $lock->unlock(); } exit();}这时候两个进程都能得到锁。sysvsem模块中的信号量sem_get 创建信号量sem_remove 删除信号量(一般不用)sem_acquire 请求得到信号量sem_release 释放信号量。和 sem_acquire 成对使用。$key = ftok('/tmp', 'c');$sem = sem_get($key);for($i=0; $i<2; $i++){$pid = pcntl_fork(); if($pid <0){ die("fork failed"); }elseif ($pid>0){ //echo "parent process \n"; }else{ echo "child process {$i} is born. \n"; obtainLock($sem, $i); }}while (pcntl_waitpid(0, $status) != -1) {$status = pcntl_wexitstatus($status); echo "Child $status completed\n"; }sem_remove($sem); // finally remove the semfunction obtainLock ($sem, $i){echo "process {$i} is getting the sem \n"; $res = sem_acquire($sem, true); sleep(1); if (!$res){ echo "process {$i} unable to get sem. \n"; }else{ echo "process {$i} successfully got the sem \n"; sem_release($sem); } exit();}这里有一个问题,sem_acquire()第二个参数$nowait默认为false,阻塞。我设为了true,如果得到锁失败,那么后面的sem_release会报警告 PHP Warning: sem_release(): SysV semaphore 4 (key 0x63000081) is not currently acquired in /home/jason/sysvsem.php on line 33, 所以这里的release操作必须放在得到锁的情况下执行,前面的几个例子中没有这个问题,没得到锁执行release也不会报错。当然最好还是成对出现,确保得到锁的情况下再release。此外,ftok这个方法的参数有必要说明下,第一个 必须是existing, accessable的文件, 一般使用项目中的文件,第二个是单字符字符串。返回一个int。输出为parent process parent process child process 1 is born. process 1 is getting the mutex child process 0 is born. process 0 is getting the mutex process 1 successfully got the mutex Child 0 completedprocess 0 unable to lock mutex. Child 0 completed最后,如果文中有错误的地方,希望大神指出,帮助一下菜鸟进步,谢谢各位。
2023年08月09日
19 阅读
0 评论
0 点赞
2023-08-09
PHP 收藏集
收藏集PHP 收藏集(一)csdnPHP 收藏集(二)Awesome PHP其他文章ThinkPHPhttps://blog.p2hp.com/archives/11222 ThinkPHPV8.0发布——AI助力开发体验一些laravel 框架学习资源http://www.cnblogs.com/yjf512/p/4061892.html 使用laravel一分钟搭建CURD后台页面https://www.laravist.com/blog/post/programming-with-laravel-5-model-controller-view-basic-workflow Laravel教程 五:MVC的基本流程https://www.laravist.com/blog/post/programming-with-laravel-5-laravel-forms-input Laravel教程 六:表单 Formshttps://www.laravist.com/blog/post/programming-with-laravel-5-database-and-eloquent-model Laravel教程 四:数据库和Eloquenthttps://my.oschina.net/u/1186749/blog/643850 php artisan常用方法http://www.verronknowles.com/laravel-migrations-with-moloquent-and-mongodb-with-mysql-still-present/http://www.opentechguides.com/tutorials/laravel-mongodb/10/mongodb-migration.htmlhttp://blog.sina.com.cn/s/blog_a77576280102x60a.htmlhttp://www.jb51.net/article/54736.htmhttp://blog.csdn.net/iroycn/article/details/47036719http://www.jb51.net/article/60989.htmhttps://blog.p2hp.com/archives/7442https://blog.p2hp.com/archives/7392 加速你的laravel框架运行, 教你如何减少服务提供者的启动.https://blog.p2hp.com/archives/7523https://blog.p2hp.com/archives/7551 使用Laravel Packer创建laravel包脚手架https://blog.p2hp.com/archives/7853 Laravel Model 利用 Macroable 为数据模型添加宏能力https://blog.p2hp.com/archives/7829 Laravel Telescope 完美的应用调试工具https://blog.p2hp.com/archives/8110 Laravel框架的Pipeline解读。它是一个非常好用的组件,能够使代码的结构非常清晰。 Laravel的中间件机制便是基于它来实现的。通过Pipeline,可以轻松实现APO编程。https://blog.p2hp.com/archives/7883 终极Laravel应用性能检查表https://blog.p2hp.com/archives/8122 Laravel框架中使用 Repository 模式Lhttps://blog.p2hp.com/archives/8120 aravel核心解读–服务提供器(ServiceProvider)https://blog.p2hp.com/archives/8114 优化laravel数据库查询的 18 个提示https://blog.p2hp.com/archives/8821 Laravel 的 ORM 缓存包https://blog.p2hp.com/archives/8677 18 个 Laravel 8 数据库查询优化建议https://blog.p2hp.com/archives/10241 Laravel 10 现已发布!新特性一览了解 Laravel 的 Macroable 特性https://blog.p2hp.com/archives/11067https://blog.p2hp.com/archives/11065框架关于如何正确使用PHP框架及如何选择框架之我见微信开发关于微信网页授权获取用户基本信息的切入问题 微信公众平台—-带参数二维码生成和扫描事件 微信开发上传图文消息内的图片(只返回图片URL),报错41005 【微信开发】网页授权多域名解决方案服务器php在Nginx环境下进行刷新缓存立即输出,实现常驻进程轮询 php nginx 实时输出 https://blog.p2hp.com/archives/5808 解决PHP的一个长期存在的通过Opcache泄漏敏感数据的问题。 https://blog.p2hp.com/archives/5789 为PHP-FPM和nginx设置多个进程池而安全地运行多个网站https://blog.p2hp.com/archives/5778 nginx不同站点的php-fpm的PHP_ADMIN_VALUE值会覆盖其它站点值的问题!https://blog.p2hp.com/archives/5814 共享APC或OPcache:为什么多个PHP-FPM主机更好https://blog.p2hp.com/archives/7768 nginx + php做服务,在高并发的时候会出现一些错误 connect() to unix:/var/run/php-fpm.sock failed (11: Resource temporarily unavailable) 。mongodb用PHP把 图片,文件上传到 mongodb gridfs 中中间件为什么要关心PHP中间件 关于中间件的一切 漫谈php框架之中间件 在PHP中实现前置/后置中间件其他周末有空,我们来聊聊几块钱的PHP 原 PHP 在不调用构造函数的情况下创建对象 https://learnku.com/php/t/24576https://blog.p2hp.com/archives/6655 PHP加密文件解密过程详解https://blog.p2hp.com/archives/6648 PHP获取类私有属性的几种方式https://blog.p2hp.com/archives/7061【PHP】获取浏览器HTTP请求header信息、获取服务器HTTP响应header信息https://blog.p2hp.com/archives/7364 php设置跨子域名可读的cookiePHP 生成器入门 https://blog.p2hp.com/archives/7243模仿laravel,使用反射来实现自动依赖注入 https://www.jianshu.com/p/9176b12eb843https://stitcher.io/blog/php-in-2020PHP8.0 JIT介绍,及如何在PHP 8中设置JIT https://blog.p2hp.com/archives/7577如何处理 PHP 中file_get_contents 函数的警告?https://blog.p2hp.com/archives/7846Zend Engine中的函数内联-使用完全限定函数名称提高PHP程序性能 https://blog.p2hp.com/archives/7967 Zend PHP8.1发布,新特性一览 https://blog.p2hp.com/archives/8224Laravel 8更改密码功能实现 https://blog.p2hp.com/archives/8210如何优化symfony(PHP)的性能 https://blog.p2hp.com/archives/8196How Livewire works (a deep dive) https://blog.p2hp.com/archives/8190移除无用的Composer加载文件,以提升性能 https://blog.p2hp.com/archives/8178现代 PHP 数据加密/解密与Sodium扩展 https://blog.p2hp.com/archives/8174PHP–激动人心的时代即将到来,让我们来看看现代的 PHP https://blog.p2hp.com/archives/8310Modern PHP Without a Framework–现代PHP不使用框架 https://blog.p2hp.com/archives/9205PHP 8.2 新特性 https://blog.p2hp.com/archives/9144PHP mysqli 查询数据库的几个方法 https://blog.p2hp.com/archives/90632023 年的 PHP https://blog.p2hp.com/archives/10124如何延长遗留 PHP 应用程序的生命周期 https://blog.p2hp.com/archives/10122Nginx 黑魔法:使用 NGX-PHP 模块低成本实现高性能应用 https://blog.p2hp.com/archives/10540https://blog.p2hp.com/archives/10282https://blog.p2hp.com/archives/10279https://blog.p2hp.com/archives/10268spatie / invade 使用私有属性和方法的 PHP 函数 https://blog.p2hp.com/archives/11069知识点web全栈大福袋 https://www.52fun.com/13860.htmlhttps://www.itresource.org/2023/08/03/web3.0热门领域nft项目实战完结/
2023年08月09日
12 阅读
0 评论
0 点赞
1
...
15
16
17
...
20