Bu, senkronize işlevlerinizi, güzel bir temiz veri bağımlılığı grafiğimize sahip olacak şekilde organize etmenin bir yolunu gösterir.
Kod:
<? hh
Namespace Hack \ KullanıcıDokümantasyonu \ Async \ Guidelines \ Examples \ DataDependencies ;
// Böylece asio-yardımcı programlarını kullanabilirsiniz function vm ()
class PostData {
// yapıcı argümanı tanıtımını kullanarak
public function __construct ( public string $ text ) {}
}
zaman uyumsuz fonksiyon fetch_all_post_ids_for_author ( int $ AUTHOR_ID )
: Awaitable < array < int >> {
// Sorgu veritabanı vb., Ancak şimdilik, yalnızca dönüşü oluşturan şeyler
döndüren dizi ( 4 , 53 , 99 );
}
zaman uyumsuz fonksiyon fetch_post_data ( int $ Post_id ) : Awaitable < PostData > {
// Sorgu veritabanı vb ama şimdi, bir şey rastgele dönüş
dönüş yeni PostData ( str_shuffle ( "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ));
}
Async fonksiyonu fetch_comment_count ( int $ posta_id ) : Bekleyilebilir < int > {
// Sorgu veritabanını vb., Ancak şu an için bir şey rastgele
dönüş return rand ( 0 , 50 );
}
zaman uyumsuz fonksiyon fetch_page_data ( int $ AUTHOR_ID )
: Awaitable < Vektör < ( PostData , int ) >> {
$ All_post_ids = fetch_all_post_ids_for_author ( $ author_id ) bekliyor ; // Bir post kimliğini bir veri kümesi kümesine dönüştüren bir eşzamanlı kapanış // post veri ve yorum sayımı $ post_fetcher = async işlevi ( int $ post_id ) : bekleniyor < ( PostData , int ) > { list ( $ post_data , $ comment_count ) = bekliyoruz \ HH \ Asio \ v ( dizi ( fetch_post_data ( $ Post_id ), Fetch_comment_count ( $ post_id ), ))); / * Sorun, v Traverable <Beklenmedik <T> değerini alır ve * Bekleyilebilir <Vektör <T> değerini döndürür , ancak her iki int ve PostData'yı temsil eden T'nin iyi bir değeri yoktur , bu nedenle şu an nerdeyse Sendika tipi. * * Şimdi tipik denetleyiciye neler olduğunu anlatmalıyız. * Gelecekte, bunu desteklemek için HH \ Asio \ va () - VarArgs - eklemeyi planlıyoruz. * Bu, * bağımsız değişken sayısına bağlı olarak değişen bir tür imza sahibidir , örneğin: * * - va (beklenebilir <T1>, Bekar <T2>): Beklenen <(T1, T2)> * - va (Bekar < T1> * Bekleyen <T2>, * Beklenebilir <T3>): Beklenebilir <(T1, T2, T3)> * * Ve benzeri türler için T1, T2, ... Tn'ye gerek kalmaz. * / Değişmez ( PostData'nın $ post_data instanceof , "Bu iyi" ); Değişmez ( is_int ( $ comment_count ), "Bu iyi" ); return tuple ( $ post_data , $ COMMENT_COUNT ); }; T1, T2, ... Tn ile ilişkili tiplere gerek kalmadan. * / Değişmez ( PostData'nın $ post_data instanceof , "Bu iyi" ); Değişmez ( is_int ( $ comment_count ), "Bu iyi" ); return tuple ( $ post_data , $ COMMENT_COUNT ); }; T1, T2, ... Tn ile ilişkili tiplere gerek kalmadan. * / Değişmez ( PostData'nın $ post_data instanceof , "Bu iyi" ); Değişmez ( is_int ( $ comment_count ), "Bu iyi" ); return tuple ( $ post_data , $ COMMENT_COUNT ); }; "Bu iyi" ); return tuple ( $ post_data , $ COMMENT_COUNT ); }; "Bu iyi" ); return tuple ( $ post_data , $ COMMENT_COUNT ); };
// sonuçların bir diziye sonrası kimliklerinin dizi Transform
asio-araçlardan gelen vm () işlevi ile //
geri bekliyoruz \ HH \ Asio \ vm ( $ all_post_ids , $ post_fetcher );
}
zaman uyumsuz fonksiyon generate_page ( int $ AUTHOR_ID ) : Awaitable < dize > {
$ tuples = bekliyor fetch_page_data ( $ AUTHOR_ID );
$ Sayfa = "" ;
Foreach ( $ tuple as $ tuple ) {
list ( $ post_data , $ comment_count ) = $ tuple ;
// Normal olarak veriyi HTML'ye dönüştürün, ancak şimdilik, sadece
// normal bir dize
$ page . = $ Post_data -> metin oluşturmanız yeterlidir . "" . $ Comment_count . PHP_EOL ;
}
Return $ sayfayı ;
}
$ Page = \ HH \ Asio \ join ( generate_page ( 13324 )); // sadece bir kullanıcı kimliği oluşturdu
var_dump ( $ page );
MySQL'e Erişme
Veritabanı bağlantısı ve sorguları gerçekleştirmek için async mysql uzantısını kullanın.
Kod:
<? hh
Namespace Hack \ User********ation \ Async \ Extensions \ Örnekler \ MySQL ;
kullanmak \ kesmek \ User********ation \ uyumsuz \ \ Extensions AsyncMysql \ ConnectionInfo \ örnek olarak CI ;
Async işlevi get_connection () : Bekleyilebilir < \ AsyncMysqlConnection > {
// Varsayılan seçeneklerle bir bağlantı havuzu edin
$ pool = new \ AsyncMysqlConnectionPool ( array ());
Bu kod test etmek için çalışır bir şey için kimlik bilgilerini değiştirme //
dönüşünü beklemektedir $ havuz > - bağlamak (
CI :: $ konak ,
CI :: $ portu ,
CI :: $ db ,
CI :: $ user ,
CI :: $ Passwd ,
);
zaman uyumsuz fonksiyon fetch_user_name ( \ AsyncMysqlConnection $ conn ,
int $ user_id ) : Awaitable < dize > {
// Masanız ve sütun kursu, farklı olabilir
$ sonucu = bekliyor $ conn -> queryf (
test_table userID =% d den 'SEÇ adı ' ,
$ Kullanıcı_adı
);
// Bir kullanıcı kimliği
değişmez ( $ result -> numRows () === 1 , 'bir satır tam' )
için birden fazla satır döndürmemelidir ; // Her sütunun dize değerlerini tutan vektör nesnelerinin vektörü
// sorguda
$ vector = $ sonuç -> vectorRows ();
Return $ vektör [ 0 ] [ 0 ]; // Sorgumuzda bir sütun vardı
}
zaman uyumsuz fonksiyon get_user_info ( \ AsyncMysqlConnection $ conn ,
dize $ user ) : Awaitable < Vector < Haritası >> {
$ sonuç = bekliyor $ conn -> queryf (
'test_table gelen * NEREDE name =% s SEÇ' ,
$ conn -> escapeString ( $ Kullanıcı )
);
//
Sorguda //
her sütunun dize değerlerini tutan harita nesnelerinin vektörü ve sütunlar sütun adlarıdır $ map = $ result -> mapRows ();
return $ harita ;
}
Async işlevi async_mysql_tutorial () : Bekleyilebilir < **** > {
$ conn = await get_connection ();
eğer ( $ Conn ==! boş ) {
$ sonuç = bekliyor fetch_user_name ( $ conn , 2 );
Var_dump ( $ sonuç );
$ Info = get_user_info'yu bekliyor ( $ conn , 'Fred Emmott' ); Var_dump ( $ info instanceof Vector ); Var_dump ( $ info [ 0 ] instanceof Haritası ); } }
\ HH \ Asio \ join ( async_mysql_tutorial ());