浅析关于PHP中Sphinx长连接问题

 更新时间:2016年11月25日 16:20  点击:2254
关于什么是Sphinx这里我不不介绍了大家可百度查一下,下面我来介绍的是关于PHP中Sphinx长连接问题解析,希望些文章对各位朋友有帮助。

SphinxClient::open
(PECL sphinx >= 1.0.3)

SphinxClient::open — 建立到搜索服务端的持久连接

说明
public bool SphinxClient::open ( void )
建立到搜索服务端的持久连接.

参数
此函数没有参数。

返回值
成功时返回 TRUE, 或者在失败时返回 FALSE.


今日在做PHP系统代码优化时,对sphinx的长连接做了一些分析发现php的sphinx api并不是我们想象中的那样会在php-fpm的fastcgi状态下一直与sphinx的searchd进程保持长连接,sphinx的api接口中open()方法仅仅提供了在一次会话请求中保证多个sphinx调用在单个php进程中是共用一个sphinx tcp连接通道,当php解释运行完,与sphinx的连接也会自动断开,而不是保持连接状态。

这篇帖子也佐证了楼主的这个想法:http://sphinxsearch.com/forum/view.html?id=7200


> So it seems that the definition of 'persistent connection' in Sphinx is different from
> persistent MySql connections when using a PhP API : the persistence is only across
> multiple calls *in the same php request execution* and not persistence within the client


> process i.e. across multiple php requests.

 

 

我们可以做一个这样的实验来证明我的观点:

给php增加sphinx.so扩展,然后写如下测试代码:


<!--?php<br /-->
$s = new SphinxClient();

var_dump($s);
$s->setServer('192.168.1.108','9312');
//$s->open();
var_dump($s->query('abxxxx'));
var_dump($s->query('abxxxx'));


注意这里$s->open()先屏蔽,然后我们在cli状态下利用strace命令跟踪执行此php脚本,收集系统调用信息会发现:

在系统调用中出现了两次connect到192.168.1.108的请求。也就是说在没调用open方法的时候,在同一个php运行时中会导致两次对sphinx产生的tcp请求。


611 fcntl64(3, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
612 connect(3, {sa_family=AF_INET, sin_port=htons(9312), sin_addr=inet_addr("192.168.1.108")}, 16) = -1 EINPROGRESS (Operation now in progress)
613 select(4, NULL, [3], NULL, {60, 0})     = 1 (out [3], left {59, 999996})
614 fcntl64(3, F_SETFL, O_RDONLY)           = 0
615 send(3, "1", 4, MSG_NOSIGNAL)    = 4
616 recv(3, "1", 4, 0)               = 4
617 send(3, "1312241", 16, MSG_NOSIGNAL) = 16
618 send(3, "246abxx"..., 140, MSG_NOSIGNAL) = 140
619 recv(3, "131`", 8, 0)       = 8
620 recv(3, "25title4text2"..., 96, 0) = 96
621 close(3)   
。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。
756 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
757 fcntl64(3, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
758 connect(3, {sa_family=AF_INET, sin_port=htons(9312), sin_addr=inet_addr("192.168.1.108")}, 16) = -1 EINPROGRESS (Operation now in progress)
759 select(4, NULL, [3], NULL, {60, 0})     = 1 (out [3], left {59, 999997})
760 fcntl64(3, F_SETFL, O_RDONLY)           = 0
761 send(3, "1", 4, MSG_NOSIGNAL)    = 4
762 recv(3, "1", 4, 0)               = 4
763 send(3, "1312241", 16, MSG_NOSIGNAL) = 16
764 send(3, "246abxx"..., 140, MSG_NOSIGNAL) = 140
765 recv(3, "131`", 8, 0)       = 8
766 recv(3, "25title4text2"..., 96, 0) = 96
767 close(3)                                = 0
768 write(1, "array(9) {n", 11array(9) {

 

 


然后我们取消open调用的注释,继续strace,会发现这时候依然是连续调用两次query方法,但在第一次query调用后api不会立即close掉tcp连接,而是继续给到第二次query调用使用。

611 fcntl64(3, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
612 connect(3, {sa_family=AF_INET, sin_port=htons(9312), sin_addr=inet_addr("192.168.1.108")}, 16) = -1 EINPROGRESS (Operation now in progress)
613 select(4, NULL, [3], NULL, {60, 0})     = 1 (out [3], left {59, 999996})
614 fcntl64(3, F_SETFL, O_RDONLY)           = 0
615 send(3, "1", 4, MSG_NOSIGNAL)    = 4
616 recv(3, "1", 4, 0)               = 4
617 send(3, "441", 12, MSG_NOSIGNAL) = 12
618 select(4, [3], NULL, [3], {0, 0})       = 0 (Timeout)
619 send(3, "1312241", 16, MSG_NOSIGNAL) = 16
620 send(3, "246abxx"..., 140, MSG_NOSIGNAL) = 140
621 recv(3, "131`", 8, 0)       = 8
622 recv(3, "25title4text2"..., 96, 0) = 96
623 write(1, "array(9) {n", 11array(9) {
624 )            = 11

 

今天我来给各位同学介绍一下关于php-fpm进程关闭与重启命令吧,PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的并且PHP5.3.3已经集成php-fpm了,不再是第三方的包了哦。

先来理解一下什么是php-fpm

PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的。   

PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。   现在我们可以在最新的PHP 5.3.2的源码树里下载得到直接整合了PHP-FPM的分支,据说下个版本会融合进PHP的主分支去。相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而PHP-FPM则没有这种烦恼。   

PHP5.3.3已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以被PHP官方收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。   使用PHP-FPM来控制PHP-CGI的FastCGI进程

master进程可以理解以下信号

INT, TERM 立刻终止
QUIT 平滑终止
USR1 重新打开日志文件
USR2 平滑重载所有worker进程并重新载入配置和二进制模块

示例:

php-fpm 关闭:

 代码如下 复制代码

kill -INT `cat /usr/local/php/var/run/php-fpm.pid`

php-fpm 重启:

 代码如下 复制代码

kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`

查看php-fpm进程数:

 代码如下 复制代码

ps aux | grep -c php-fpm

php-fmp的重启 (方法二)

先执行

 代码如下 复制代码

killall php-fpm

再执行(usr/local/php是php的安装目录)

 代码如下 复制代码

/usr/local/php/sbin/php-fpm &

本文章记录一下自己在学习php MemCache内存缓存的一些学习笔记与理解,现在与各位朋友分享,希望此文章对大家有帮助。

一、Memcache简介

Memcache(内存,缓存) :是一个高性能的分布式的内存对象缓存系统。通过在内存里维护一个巨大的HashTable。由Memcached来管理这个巨大的HashTable。

二、Memcache 与 Memcached的区别
Memcache是软件名称,Memcached是启动后的进程名称。

三、Memcache工作原理
memcached是以守护程序方式运行于一个或多个服务器中,随时会接收客户端的连接和操作。
在没有安装memcache的时候网站工作的原理是:浏览器访问服务器脚本,然后服务器脚本访问数据库,处理后输出给浏览器。
而如果你的服务器安装了memcache的话,在执行了第一次数据库查询后,服务器脚本后把结果集存储到memcached内存缓存中,以后使用的时候就可不必查询数据库而是直接向memcached内存缓存索取,大大提高的效率。

四、安装Memcache服务器

 代码如下 复制代码

wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz
tar -zxvf memcached-1.4.15.tar.gz
cd memcached-1.4.15.tar.gz
./configure
Make && make install

五、Memcached服务器启动时的基本设置
如:Memcahced –d –m 128 –l 192.168.1.111 –p 11211 –u root
下边是Memcahced 部分参数的说明
-p memcached监听的TCP端口
-l 连接的IP地址, 默认是本机
-d 以daemon方式运行,将程序放入后台
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB ,最大好像2G
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助

本文章来给各位同学介绍使用memcache构建简单的内存消息队列,用一个比较不错的实例来给大家介绍,希望此方法对大家有帮助哦。

memcache功能太简单了,只能 set get 和delete, 只能保存key-value的数据, 不能保存列表。 当然也可以把一个列表给序列化了之后存进memcache, 但是会存在并发的问题, 每次保存数据(插队或者出队)的时候都要给数据加锁,在高并发的情况下很难保证数据的一致性!
        但是memcache 有一个 increment 的操作,为某一个键对应的值进行加1(实际上是加法运算, 默认加1), 这个操作是原子性的, 所以我们可以通过这个来维护一个自增的id来保证数据的唯一。 再加上两个指针来维护起始键值, 这样就构建了一个简单的但相队列!!      

memcache queue 

上代码:       

 代码如下 复制代码
<?php
/**
 * memcache构建的简单内存队列
 *
 * @author: jeffjing
 */
class memList {
 private $memcache; // memcache类
 
 private $queKeyPrefix; //数据键前缀
 private $startKey; //开始指针键
 private $startKey; //结束指针键
 
 public function __construct($key){
  $this->queKeyPrefix = "MEMQUE_{$key}_";
  $this->startKey = "MEMQUE_SK_{$key}";
  $this->endKey = "MEMQUE_EK_{$key}"; 
 }
 
 /**
  * 获取列表
  *  先拿到开始结束指针, 然后去拿数据
  *
  * @return array
  */
 public function getList(){
  $startP = $this->memcache->get($this->startKey);
  $endP = $this->memcache->get($this->endKey);  
  empty($startP) && $startP = 0;
  empty($endP) && $endP = 0;
 
  $arr = array();
  for($i = $startP ; $i < $endP; ++$i) {
   $key = $this->queKeyPrefix . $i;
   $arr[] = $this->memcache->get($key);
  }
  return $arr;
 }
 
 /**
  * 插入队列
  *   结束指针后移,拿到一个自增的id
  *   再把值存到指针指定的位置
  *  
  *   @return void
  */
 public function in($value){
  $index = $this->memcache->increment($this->endKey);
  $key = $this->queKeyPrefix . $index;
  $this->memcache->set($key, $value);
 }
 
 /**
  * 出队
  *    很简单, 把开始值取出后开始指针后移
  *
  * @return mixed
  */
 public function out(){
  $result = $this->memcache->get($this->startKey);
  $this->memcache->increment($this->startKey);
  return $result;
 }
 
}

关于memcached的一些事情


内存存储方式(slab allocator)

memcached的数据存储方式为slab allocator即数据分片, 在服务启动的时候先把内存分成不同大小的 chunk, 当有数据过来的时候来存储到一个合适大小的chunk当中
之前版本是直接分配内存, 导致内存碎片 随机查找等问题。。。


数据过期删除机制


memcached在数据过期之后,并不会去删除数据, 但是不能访问过期的数据, 过期数据占用的空间会被重复利用
memcached采用lazy expiration.不会去主动扫描一个数据项是否过期, 而是在数据get的时候判断是否已经过期.
删除的算法是LRU(Least Recently Used) , 优先删除最近使用较少的数据


memcached的分布式机制


虽说memcached是一个分布式的缓存, 但是memcached本身并没有实现任何分布式的机制, 分布式的功能主要是由客户端来实现的。
程序通过addserver增加多个memcahced服务到客户端(memcache扩展), 在存取数据之前,客户端会先通过hash算法得到存储数据的节点, 然后再去存取数据, 当其中一台memcached服务器挂掉或者新增一台memcached服务器, hash算法得到的存储数据的节点就会变化, 去新的服务器上去存取数据。

讲过利用jquery ajax与php实现图片上传,下面我介绍利用php ajax实现各种文件无刷新上传,直接放实例希望给各位同学有帮助。

可以批量进行添加上传,简单方便

 代码如下 复制代码
 

<script type="text/javascript" src="jquery-1.5.1.min.js"></script>
 

<script    type="text/javascript" >


jQuery.extend({
   
 

    createUploadIframe: function(id, uri)
    {
           //create frame
            var frameId = 'jUploadFrame' + id;
            var iframeHtml = '<iframe id="' + frameId + '" name="' + frameId + '" style="position:absolute; top:-9999px; left:-9999px"';
           if(window.ActiveXObject)
           {
                if(typeof uri== 'boolean'){
                  iframeHtml += ' src="' + 'javascript:false' + '"';
 

                }
                else if(typeof uri== 'string'){
                  iframeHtml += ' src="' + uri + '"';
 

                }
           }
           iframeHtml += ' />';
           jQuery(iframeHtml).appendTo(document.body);
 

            return jQuery('#' + frameId).get(0);       
    },
    createUploadForm: function(id, fileElementId, data)
    {
       //create form
       var formId = 'jUploadForm' + id;
       var fileId = 'jUploadFile' + id;
       var form = jQuery('<form  action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');  
       if(data)
       {
           for(var i in data)
           {
              jQuery('<input type="hidden" name="' + i + '" value="' + data[i] + '" />').appendTo(form);
           }         
       }     
       var oldElement = jQuery('#' + fileElementId);
       var newElement = jQuery(oldElement).clone();
       jQuery(oldElement).attr('id', fileId);
       jQuery(oldElement).before(newElement);
       jQuery(oldElement).appendTo(form);
 

 

      
       //set attributes
       jQuery(form).css('position', 'absolute');
       jQuery(form).css('top', '-1200px');
       jQuery(form).css('left', '-1200px');
       jQuery(form).appendTo('body');    
       return form;
    },
 

    ajaxFileUpload: function(s) {
        // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout     
        s = jQuery.extend({}, jQuery.ajaxSettings, s);
        var id = new Date().getTime()       
       var form = jQuery.createUploadForm(id, s.fileElementId, (typeof(s.data)=='undefined'?false:s.data));
       var io = jQuery.createUploadIframe(id, s.secureuri);
       var frameId = 'jUploadFrame' + id;
       var formId = 'jUploadForm' + id;      
        // Watch for a new set of requests
        if ( s.global && ! jQuery.active++ )
       {
           jQuery.event.trigger( "ajaxStart" );
       }           
        var requestDone = false;
        // Create the request object
        var xml = {}  
        if ( s.global )
            jQuery.event.trigger("ajaxSend", [xml, s]);
        // Wait for a response to come back
        var uploadCallback = function(isTimeout)
       {         
           var io = document.getElementById(frameId);
            try
           {            
              if(io.contentWindow)
              {
                   xml.responseText = io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null;
                   xml.responseXML = io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocument:io.contentWindow.document;
                  
              }else if(io.contentDocument)
              {
                   xml.responseText = io.contentDocument.document.body?io.contentDocument.document.body.innerHTML:null;
                  xml.responseXML = io.contentDocument.document.XMLDocument?io.contentDocument.document.XMLDocument:io.contentDocument.document;
              }                   
            }catch(e)
           {
              jQuery.handleError(s, xml, null, e);
           }
            if ( xml || isTimeout == "timeout")
           {            
                requestDone = true;
                var status;
                try {
                    status = isTimeout != "timeout" ? "success" : "error";
                    // Make sure that the request was successful or notmodified
                    if ( status != "error" )
                  {
                        // process the data (runs the xml through httpData regardless of callback)
                        var data = jQuery.uploadHttpData( xml, s.dataType );   
                        // If a local callback was specified, fire it and pass it the data
                        if ( s.success )
                            s.success( data, status );
   
                        // Fire the global callback
                        if( s.global )
                            jQuery.event.trigger( "ajaxSuccess", [xml, s] );
                    } else
                        jQuery.handleError(s, xml, status);
                } catch(e)
              {
                    status = "error";
                    jQuery.handleError(s, xml, status, e);
                }
 

                // The request was completed
                if( s.global )
                    jQuery.event.trigger( "ajaxComplete", [xml, s] );
 

                // Handle the global AJAX counter
                if ( s.global && ! --jQuery.active )
                    jQuery.event.trigger( "ajaxStop" );
 

                // Process result
                if ( s.complete )
                    s.complete(xml, status);
 

                jQuery(io).unbind()
 

                setTimeout(function()
                                {   try
                                   {
                                       jQuery(io).remove();
                                       jQuery(form).remove();  
                                      
                                   } catch(e)
                                   {
                                       jQuery.handleError(s, xml, null, e);
                                   }                              
 

                                }, 100)
 

                xml = null
 

            }
        }
        // Timeout checker
        if ( s.timeout > 0 )
       {
            setTimeout(function(){
                // Check to see if the request is still happening
                if( !requestDone ) uploadCallback( "timeout" );
            }, s.timeout);
        }
        try
       {
 

           var form = jQuery('#' + formId);
           jQuery(form).attr('action', s.url);
           jQuery(form).attr('method', 'POST');
           jQuery(form).attr('target', frameId);
            if(form.encoding)
           {
              jQuery(form).attr('encoding', 'multipart/form-data');              
            }
            else
           {  
              jQuery(form).attr('enctype', 'multipart/form-data');       
            }       
            jQuery(form).submit();
 

        } catch(e)
       {         
            jQuery.handleError(s, xml, null, e);
        }
      
       jQuery('#' + frameId).load(uploadCallback );
        return {abort: function () {}}; 
 

    },
 

    uploadHttpData: function( r, type ) {
        var data = !type;
        data = type == "xml" || data ? r.responseXML : r.responseText;
        // If the type is "script", eval it in global context
        if ( type == "script" )
            jQuery.globalEval( data );
        // Get the JavaScript object, if JSON is used.
        if ( type == "json" )
            eval( "data = " + data );
        // evaluate scripts within html
        if ( type == "html" )
            jQuery("<div>").html(data).evalScripts();
 

        return data;
    }
})

</script>
 

<form id="upform" action="" method="post" enctype="multipart/form-data">
    <input id='fname' size='80' /><br> <input type="file" name="file1"
       id="file1" size="30" /> <input type="button" value="上传"
       onclick="return ajaxFileUpload();" /> <span id="msg"
       style="display: none">UpLoading...</span>
</form>
 

<script type="text/javascript">
var str = '';
function ajaxFileUpload(){ 
    $("#msg")
    .ajaxStart(function(){
       $(this).show();
    });
    /*
    .ajaxComplete(function(){
       $(this).hide();
    });
    */
    $.ajaxFileUpload(
    {
       url:'up_deal.php',
       secureuri:false,
       fileElementId:'file1',
       dataType: 'text',
       //data:{name:'qinmi', id:'123'},
       success: function(data){
              if(data=='error'){
                  $('#msg').html("<span style='color:red'>上传失败</span>");
              }else{
                  $('#msg').html("<span style='color:green'>上传成功</span>");
                  str +=  data+'@';
                  $('#fname').val(str);
              }
           }
       }
    );
    return false;
}
</script>


 
up_deal.php

 代码如下 复制代码

<?php
if ((($_FILES["file1"]["type"] == "image/gif")
|| ($_FILES["file1"]["type"] == "image/jpeg")
|| ($_FILES["file1"]["type"] == "image/bmp")
|| ($_FILES["file1"]["type"] == "image/pjpeg"))
&& ($_FILES["file1"]["size"] < 100000)){//100KB
    $extend = explode(".",$_FILES["file1"]["name"]);
    $key = count($extend)-1;
    $ext = ".".$extend[$key];
    $newfile = time().$ext;
 

    if(!file_exists('upload')){mkdir('upload');}
    move_uploaded_file($_FILES["file1"]["tmp_name"],"upload/" . $newfile);
    @unlink($_FILES['file1']);
    echo $newfile;
}else {
    echo 'error';
}
?>

[!--infotagslink--]

相关文章

  • PHP传值到不同页面的三种常见方式及php和html之间传值问题

    在项目开发中经常见到不同页面之间传值在web工作中,本篇文章给大家列出了三种常见的方式。接触PHP也有几个月了,本文总结一下这段日子中,在编程过程里常用的3种不同页面传值方法,希望可以给大家参考。有什么意见也希望大...2015-11-24
  • mysql 关键词相关度排序方法详细示例分析

    小项目有时需要用到关键词搜索相关性排序,用sphinx显得杀鸡用牛刀,就用mysql的order by或者php里设置权重...2013-09-23
  • js修改input的type属性问题探讨

    js修改input的type属性有些限制。当input元素还未插入文档流之前,是可以修改它的值的,在ie和ff下都没问题。但如果input已经存在于页面,其type属性在ie下就成了只读属性了,不可以修改。...2013-10-19
  • Mysql常见问题集锦

    1,utf8_bin跟utf8_general_ci的区别 ci是 case insensitive, 即 "大小写不敏感", a 和 A 会在字符判断中会被当做一样的; bin 是二进制, a 和 A 会别区别对待. 例如你运行: SELECT * FROM table WHERE txt = 'a'...2013-10-04
  • Mysql大小写敏感的问题

    一、1 CREATE TABLE NAME(name VARCHAR(10)); 对这个表,缺省情况下,下面两个查询的结果是一样的:复制代码 代码如下: SELECT * FROM TABLE NAME WHERE name='clip'; SELECT * FROM TABLE NAME WH...2015-03-15
  • linux mint 下mysql中文支持问题

    一.mysql默认不支持中文,它的server和db默认是latin1编码.所以我们要将其改变为utf-8编码,因为utf-8包含了地球上大部分语言的二进制编码 1.关闭mysql服务 sudo /etc/init.d/mysql stop 2.修改mysql配置文件 mysql配...2015-10-21
  • js有序数组的连接问题

    1.前言 昨天碰到一道关于如何解决有序数组的连接问题,这是一个很常见的问题。但是这里要考虑到代码的效率问题,因为要连接的数组都是有序的,这是一个非常重要的前提条件。2.简单但效率不高的算法 我首先想到的是使用...2013-10-04
  • C#连接Oracle数据库字符串(引入DLL)的方式

    这篇文章主要给大家介绍了关于C#连接Oracle数据库字符串(引入DLL)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
  • C#连接到sql server2008数据库的实例代码

    这篇文章主要介绍了C#连接到sql server2008数据库的实例代码,需要的朋友可以参考下...2020-06-25
  • A789如何连接无线网络上网

    A789使用过程中,一般有两种途径满足上网的需求,一是通过手机卡上网,一是通过周边存在的无线网络上网。不论上网的速度、还是从需求的费用看,通过无线网络上网都具有绝对的...2016-09-20
  • MySQL远程连接不上的解决方法

    这篇文章主要为大家详细介绍了MySQL远程连接不上的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-01-26
  • C#使用队列(Queue)解决简单的并发问题

    这篇文章主要介绍了使用队列(Queue)解决简单的并发问题,讲解的很细致,喜欢的朋友们可以了解一下...2020-06-25
  • vscode通过Remote SSH远程连接及离线配置的方法

    这篇文章主要介绍了vscode通过Remote SSH远程连接及离线配置的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-16
  • windows 10 安装和使用中5个常见问题

    2015年7月29日0点起,Windows 10推送全面开启,Windows7、Windows8.1用户可以免费升级到Windows 10,用户也可以通过系统升级到Windows10,在这过程中,用户会遇到这样那样的问题,下面小编总结了windows 10 安装和使用中5个常见问题,需要的朋友可以参考下...2016-01-27
  • php中session常见问题分析

    PHP的session功能,一直为许多的初学者为难。就连有些老手,有时都被搞得莫名其妙。本文,将这些问题,做一个简单的汇总,以便大家查阅。 1. 错误提示 引用 代...2016-11-25
  • javascript学习指南之回调问题

    回调函数被认为是一种高级函数,一种被作为参数传递给另一个函数(在这称作"otherFunction")的高级函数,回调函数会在otherFunction内被调用(或执行)。回调函数的本质是一种模式(一种解决常见问题的模式),因此回调函数也被称为回调模式。...2016-04-25
  • 教你使用Python连接oracle

    今天教各位小伙伴怎么用Python连接oracle,文中附带非常详细的图文示例,对正在学习的小伙伴们很有帮助哟,需要的朋友可以参考下...2021-05-18
  • IIS中保持HTTP连接的设置方法

    这篇文章主要介绍了IIS中保持HTTP连接的设置方法,需要的朋友可以参考下...2016-01-27
  • 解决阿里云ssh远程连接短时间就会断掉的问题

    这篇文章主要介绍了阿里云ssh远程连接短时间就会断掉的解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • json error: Use of overloaded operator [] is ambiguous错误的解决方法

    今天小编就为大家分享一篇关于json error: Use of overloaded operator [] is ambiguous错误的解决方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...2020-04-25