mysql_unbuffered_query

(PHP 4 >= 4.0.6, PHP 5)

mysql_unbuffered_querySonuç kümesi tamponlanmayan ve alınmayan bir SQL sorgusu gönderir

Açıklama

resource mysql_unbuffered_query ( string $sorgu [, resource $bağlantı_belirteci ] )

mysql_unbuffered_query() işlevi mysql_query() işlevinin yaptığı gibi sonuç kümesini tamponlamadan ve içindekileri almamak üzere sorgu SQL sorgusunu MySQL'e gönderir. Başka bir deyişle, büyük sonuç kümeleri üreten SQL sorgularından kaynaklanan bellek tüketimini azaltır. Yani, ilk satırı alır almaz sonuç kümesiyle çalışmaya başlayabilirsiniz; SQL sorusunun tamamlanmasını beklemeniz gerekmez.Çok sayıda veritabanı bağlantısı kullanıyorsanız belirtilmesi isteğe bağlı olan bağlantı_belirteci değiştirgesini de belirtmeniz gerekir.

Değiştirgeler

sorgu

Bir SQL sorgusu.

Sorgunun içerdiği verinin gerektiği gibi öncelenmesi gerekir.

bağlantı_belirteci

MySQL bağlantısı. Eğer bağlantı belirteci belirtilmemişse mysql_connect() tarafından açılan son bağlantı kullanılmaya çalışılır. Eğer böyle bir bağlantı yoksa mysql_connect() değiştirgesiz olarak çağrılmış gibi bir bağlantı oluşturmaya çalışır. Hiçbir bağlantı yoksa ve yenisi de kurulamazsa E_WARNING seviyesinde bir hata üretilir.

Dönen Değerler

SELECT, SHOW, DESCRIBE ve EXPLAIN deyimleri için mysql_unbuffered_query() başarı durumunda bir özkaynak aksi takdirde FALSE döndürür.

UPDATE, DELETE, DROP gibi diğer SQL deyimi türlerinde, mysql_unbuffered_query() başarı durumunda TRUE aksi takdirde FALSE döndürür.

Notlar

Bilginize:

mysql_unbuffered_query() işlevinin getirilerinin yanında götürüleri de vardır: mysql_unbuffered_query() işlevinden dönen bir sonuç kümesi üzerinde mysql_num_rows() ve mysql_data_seek() işlevlerini kullanamazsınız. Ayrıca, MySQL'e yeni bir SQL sorgusu göndermeden önce tamponsuz bir SQL sorgusundan kaynaklanan sonuç kümesinin tamamını almanız gerekir.

Ayrıca Bakınız

add a note add a note

User Contributed Notes 5 notes

up
1
crazyone at crazycoders dot net
6 years ago
You are NOT required to read all rows from the resultset when using unbuffered query, you may opt out at any time and use mysql_free_result. Imagine looking at 1 million row when the first 50 suffice? Just free the result and you are good to go again.
up
1
post at jfl dot dk
10 years ago
If using optimized MyISAM tables I guess there is a big advantage with this function as it is possible to do selects and inserts on the same time as long as no rows in the table gets updated.
up
0
frappyjohn at dos2linux dot org
11 years ago
Don't let the two hands confuse you, these are both advantages (they should really be on the same hand):

On the one hand, this saves a considerable amount of memory with SQL queries that produce large result sets.

On the other hand, you can start working on the result set immediately ...
up
0
david at php dot net
12 years ago
You are absolutely required to retrieve all rows in the result set (option 'a' in the first comment). If you fail to do so, PHP will do so for you, and will emit a NOTICE warning you of the fact. From the MySQL API, "Furthermore, you must retrieve all the rows even if you determine in mid-retrieval that you've found the information you were looking for. ".

Also note that if you are using this function, you should be quick about processing the result set, or you will tie up the MySQL server (other threads will be unable to write to the tables you are reading from).

If you want to be able to 'abort' mid result-set or if you want to do lengthy processing on the results, you are misunderstanding the purpose of this function.

Also note that UPDATE queries etc return no result set, so this function is only useful for SELECT etc.
up
-4
shaner at accretivetg dot com
11 years ago
Regarding bailing on a really large result, while doing an unbuffered query, there _is_ a way to do this: kill the thread and exit your processing loop.  This, of course, requires having a separate database link.  Something like below does the trick:

<?php
// a db link for queries
$lh  = mysql_connect( 'server', 'uname', 'pword' );
// and a controller link
$clh = mysql_connect( 'server', 'uname', 'pword', true );

if (
mysql_select_db ( 'big_database', $lh ) )
{
 
$began  time();
 
$tout   = 60 * 5; // five minute limit
 
$qry    = "SELECT * FROM my_bigass_table";
 
$rh     = mysql_unbuffered_query( $qry, $lh );
 
$thread = mysql_thread_id ( $lh );
  while (
$res = mysql_fetch_row( $rh ) )
  {
   
/* do what you need to do
     * ...
     * ...
     */
   
if ( ( time() - $began ) > $tout )
    {
     
// this is taking too long
     
mysql_query( "KILL $thread", $clh );
      break;
    }
  }
}
?>
To Top