อัลกอริทึมที่อยู่เบื้องหลังการสร้าง nginx etag


17

อัลกอริทึมที่ใช้ในการสร้าง etags ใน Nginx คืออะไร? พวกเขาดูเหมือน "554b73dc-6f0d" ตอนนี้

พวกเขาสร้างจากการประทับเวลาเท่านั้นหรือไม่


1
ฉันไม่เชื่อว่าพวกเขามี inode (ต่างจาก Apache โดยค่าเริ่มต้น) ... แม้ว่าฉันจะมีความยากลำบากในการหาที่ฉันพบว่าเมื่อนานมาแล้ว (ดีกว่าสำหรับแคชคลัสเตอร์) คุณทำงานในสภาพแวดล้อมที่ไม่มีนาฬิกาที่มีประโยชน์ (เช่นฝังอยู่) หรือไม่?
Cameron Kerr

1
มีข้อมูลบางอย่างที่เกี่ยวข้องในdeveloper.yahoo.com/performance/rules.html#etags (แต่ไม่เกี่ยวกับ Nginx)
Cameron Kerr

คำตอบ:


32

จากซอร์สโค้ด: http://lxr.nginx.org/ident?_i=ngx_http_set_etag

1803 ngx_int_t
1804 ngx_http_set_etag(ngx_http_request_t *r)
1805 {
1806     ngx_table_elt_t           *etag;
1807     ngx_http_core_loc_conf_t  *clcf;
1808 
1809     clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
1810 
1811     if (!clcf->etag) {
1812         return NGX_OK;
1813     }
1814 
1815     etag = ngx_list_push(&r->headers_out.headers);
1816     if (etag == NULL) {
1817         return NGX_ERROR;
1818     }
1819 
1820     etag->hash = 1;
1821     ngx_str_set(&etag->key, "ETag");
1822 
1823     etag->value.data = ngx_pnalloc(r->pool, NGX_OFF_T_LEN + NGX_TIME_T_LEN + 3);
1824     if (etag->value.data == NULL) {
1825         etag->hash = 0;
1826         return NGX_ERROR;
1827     }
1828 
1829     etag->value.len = ngx_sprintf(etag->value.data, "\"%xT-%xO\"",
1830                                   r->headers_out.last_modified_time,
1831                                   r->headers_out.content_length_n)
1832                       - etag->value.data;
1833 
1834     r->headers_out.etag = etag;
1835 
1836     return NGX_OK;
1837 }

คุณสามารถดูได้ในบรรทัด 1830 และ 1831 ว่าอินพุตเป็นเวลาที่แก้ไขล่าสุดและความยาวของเนื้อหา


เปรียบเทียบกับApache ETagsซึ่งคำนวณจากเวลาและขนาดการแก้ไข แต่ยังสามารถกำหนดค่าให้ขึ้นอยู่กับ inode ของไฟล์
Raedwald

1

ใน PHP ใครจะต้องใช้

$pathToFile = '/path/to/file.png';

$lastModified = filemtime($pathToFile);
$length = filesize($pathToFile);

header('ETag: "' . sprintf('%x-%x', $lastModified, $length) . '"');

3
สิ่งนี้ดีกว่าคำตอบที่ยอมรับได้อย่างไร
RalfFriedl

1
@RalfFriedl คำตอบนี้จะดีกว่าสำหรับโปรแกรมเมอร์ PHP เพราะในอนาคตโปรแกรมเมอร์ PHP บางคนเช่นฉันจะค้นหาคำหลัก 3 คำ "nginx", "etag", "alg" และเขาจะหาคำตอบของฉัน สิ่งนี้อาจป้องกันการสร้างคำถามซ้ำ
Max_Payne
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.